代码之家  ›  专栏  ›  技术社区  ›  AndrewC

动态列表<t>类型[重复]

  •  13
  • AndrewC  · 技术社区  · 14 年前

    是否可以创建新的 List<T> 运行时动态设置t的位置?

    干杯

    5 回复  |  直到 13 年前
        1
  •  26
  •   Dan Bryant    14 年前

    这是可能的,但不一定有用,因为您实际上不能从编译后的代码中使用它作为强类型。创建代码将是

        Type myType;
        Type listType = typeof(List<>).MakeGenericType(myType);
        IList myList = (IList)Activator.CreateInstance(listType);
    
        2
  •  9
  •   Reed Copsey    14 年前

    对。您可以通过反射、使用 Type.MakeGenericType Activator.CreateInstance .

    IList MakeListOfType(Type listType)
    {
        Type listType = typeof(List<>);
        Type specificListType = listType.MakeGenericType(listType);
    
        return (IList)Activator.CreateInstance(specificListType);
    }
    
        3
  •  1
  •   Jason Kresowaty    14 年前

    对。但是,您将无法将它赋给具有泛型类型的变量,因为在这种情况下,直到运行时才会确定T。(如果您认为.NET 4.0协方差功能将帮助您,并允许您将变量声明为 IList<SomeSuperType> 它不会像 T 由使用 List<T> 两者皆适用 in out 目的。)

    请注意异常列表<gt;语法,以便访问“untructed”泛型类型。

        public static System.Collections.IList ConstructGenericList(Type t)
        {
            return (System.Collections.IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(t));
        }
    
        4
  •  1
  •   Tim Cooper    13 年前

    对于DataContractSerializer已知类型,您可能不仅要提供程序集中的类型,还需要提供该类型的列表:

    public static List<Type> GetKnownTypesForDataContractSerializer()
    {
        Assembly a = Assembly.GetExecutingAssembly();
        Type[] array = a.GetExportedTypes();
    
        List<Type> lista = array.ToList();
    
        lista = lista.FindAll(item => ((item.IsClass || item.IsEnum) & !item.IsGenericType & !item.IsAbstract == true));
    
    
    
        List<Type> withEnumerable = new List<Type>();
        foreach (Type t in lista)
        {
            withEnumerable.Add(t);   //add basic type
    
            //now create List<> type
            Type listType = typeof(List<>);
            var listOfType = listType.MakeGenericType(t);
    
            withEnumerable.Add(listOfType);  //add Type of List<basic type>  
        }
    
        return withEnumerable;
    }
    
        5
  •  -1
  •   Luiscencio    14 年前

    是的,使用通用的,你可以这样做

        var asd = METHOD<Button>();
    
        List<t> METHOD<t>()
        {
            return new List<t>();
        }