Generic T从类中获取类型

时间:2011-09-10 12:41:53

标签: c# generics

我怎样才能让它发挥作用? var x =期望的错误类型或命名空间名称。

class Program
{
    static void Main(string[] args)
    {
        Person j = new John();
        var t = j.GetType();
        var x = new List<t>();
    }
}

class John : Person
{

}

class Person
{
    public string Name;
}

3 个答案:

答案 0 :(得分:3)

不可能使用这样的泛型。通用类和函数的所有类型参数必须在编译时知道(即它们必须是硬编码的),而在您的情况下,j.GetType()的结果只能在运行时知道。

泛型旨在提供编译类型的安全性,因此无法解除此限制。它可以在某些情况下解决,例如可以使用类型参数调用泛型方法,该类型参数仅在编译时使用Reflection知道,但如果可能,这通常应该避免。

答案 1 :(得分:3)

你可以这样做,但你必须使用反射来做到这一点。

    static void Main(string[] args)
    {
        Person j = new John();
        var t = j.GetType();
        Type genType = Type.MakeGenericType(new Type[] { typeof(List<>) });
        IList x =  (IList) Activator.CreateInstance(genType, t);        
    }

或者非常简单:

    static void Main(string[] args)
    {
        Type genType = Type.MakeGenericType(new Type[] { typeof(List<>) });
        IList x =  (IList) Activator.CreateInstance(genType, typeof(John)); 
    }

您需要使用IList Interface,因为您需要将内容添加到列表中

答案 2 :(得分:2)

因为必须在编译时知道泛型。在List<T>中,T必须是常量类型,例如List<Person>