开发者

What is the difference between a generic type and a generic type definition?

I'm Studying up on .net reflection and am having a hard time figuring out the difference.

Fr开发者_运维知识库om what I understand, List<T> is a generic type definition. Does that mean that to .net reflection T is the generic type?

Specifically, I guess I'm looking for more background on the Type.IsGenericType and Type.IsGenericTypeDefinition functions.

Thanks!


In your example List<T> is a generic type definition. T is called a generic type parameter. When the type parameter is specified like in List<string> or List<int> or List<double> then you have a generic type. You can see that by running some code like this...

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);    
}

Which will print

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.

Another way to get the generic type definition directly is typeof(List<>) or typeof(Dictionary<,>).


This will help explain it maybe:

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.");
}

If you run it you will get the first test to pass because both items are implementing the type List<T>. The second test fails because List<string> is not the same as List<int>. The generic type definition is comparing the original generic before T is defined.

The IsGenericType type is just checking if the generic T has been defined. IsGenericTypeDefinition checks to see that the generic T has NOT been defined. This is useful if you want to know if two objects have been defined from the same base generic type such as the first List<T> example.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜