是否可以创建一个新的List<T>
,其中T是在运行时动态设置的?
干杯
答案 0 :(得分:26)
这是可能的,但不一定有用,因为您实际上无法将已编译的代码实际用作强类型。创建代码将是
Type myType;
Type listType = typeof(List<>).MakeGenericType(myType);
IList myList = (IList)Activator.CreateInstance(listType);
答案 1 :(得分:9)
是。您可以使用Type.MakeGenericType和Activator.CreateInstance通过反思执行此操作。
IList MakeListOfType(Type listType)
{
Type listType = typeof(List<>);
Type specificListType = listType.MakeGenericType(listType);
return (IList)Activator.CreateInstance(specificListType);
}
答案 2 :(得分:1)
是。但是,您将无法将其分配给具有泛型类型的变量,因为在此情况下T将在运行时之前不会被确定。 (如果您认为.NET 4.0协方差功能对您有所帮助,并允许您将变量声明为IList<SomeSuperType>
,那么T
将List<T>
用于in
{1}}和out
目的。)
注意不寻常的列表&lt;&gt;语法以访问“未构造的”泛型类型。
public static System.Collections.IList ConstructGenericList(Type t)
{
return (System.Collections.IList)Activator.CreateInstance(typeof(List<>).MakeGenericType(t));
}
答案 3 :(得分:1)
对于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;
}
答案 4 :(得分:-1)
是的,使用泛型你可以做这样的事情
var asd = METHOD<Button>();
List<t> METHOD<t>()
{
return new List<t>();
}