动态列表<t>类型</t>

时间:2010-03-18 23:49:13

标签: c# .net dynamic

是否可以创建一个新的List<T>,其中T是在运行时动态设置的?

干杯

5 个答案:

答案 0 :(得分:26)

这是可能的,但不一定有用,因为您实际上无法将已编译的代码实际用作强类型。创建代码将是

    Type myType;
    Type listType = typeof(List<>).MakeGenericType(myType);
    IList myList = (IList)Activator.CreateInstance(listType);

答案 1 :(得分:9)

是。您可以使用Type.MakeGenericTypeActivator.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>,那么TList<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>();
    }