泛型类型和泛型类型定义有什么区别?

时间:2010-04-02 02:33:58

标签: .net generics reflection

我正在研究.net反思,我很难搞清楚差异。

据我所知,List<T>是一般类型定义。这是否意味着.net反射T是泛型类型?

具体来说,我想我正在寻找有关Type.IsGenericType和Type.IsGenericTypeDefinition函数的更多背景知识。

谢谢!

2 个答案:

答案 0 :(得分:29)

在您的示例中,List<T>是泛型类型定义。 T称为泛型类型参数。如果在List<string>List<int>List<double>中指定了type参数,那么您就拥有了泛型类型。您可以通过运行这样的代码来看到...

public static void Main()
{
    var l = new List<string>();
    PrintTypeInformation(l.GetType());
    PrintTypeInformation(l.GetType().GetGenericTypeDefinition());
}

public static void PrintTypeInformation(Type t)
{
    Console.WriteLine(t);
    Console.WriteLine(t.IsGenericType);
    Console.WriteLine(t.IsGenericTypeDefinition);    
}

将打印

System.Collections.Generic.List`1[System.String] //The Generic Type.
True //This is a generic type.
False //But it isn't a generic type definition because the type parameter is specified
System.Collections.Generic.List`1[T] //The Generic Type definition.
True //This is a generic type too.                               
True //And it's also a generic type definition.

直接获取通用类型定义的另一种方法是typeof(List<>)typeof(Dictionary<,>)

答案 1 :(得分:1)

这可能有助于解释它:

List<string> lstString = new List<string>();
List<int> lstInt = new List<int>();

if (lstString.GetType().GetGenericTypeDefinition() ==
    lstInt.GetType().GetGenericTypeDefinition())
{
    Console.WriteLine("Same type definition.");
}

if (lstString.GetType() == lstInt.GetType())
{
    Console.WriteLine("Same type.");
}

如果您运行它,您将获得第一个要通过的测试,因为这两个项目都实现了类型List<T>。第二次测试失败,因为List<string>List<int>不同。泛型类型定义在定义T之前比较原始泛型。

IsGenericType类型只是检查是否已定义通用TIsGenericTypeDefinition检查是否尚未定义通用T。如果您想知道是否已从相同的基本泛型类型(例如第一个List<T>示例)定义了两个对象,这将非常有用。