Я Учусь на отражении .NET и нелегко выяснять различие.
Из того, что я понимаю, List<T>
универсальное определение типа. Это означает, что к отражению .NET T является универсальным типом?
А именно, я предполагаю, что ищу больше фона на Типе. IsGenericType и Тип. Функции IsGenericTypeDefinition.
Спасибо!
В вашем примере List
является определением универсального типа. T
называется параметром универсального типа. Если параметр типа указан как в List
или List
или List
, тогда у вас есть общий тип. Вы можете увидеть это, запустив какой-нибудь код вроде этого ...
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 ( Словарь <,>)
.
Это поможет объяснить это, возможно:
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
не совпадает с List
. Определение универсального типа сравнивает исходный универсальный до определения T
.
Тип IsGenericType
просто проверяет, определен ли общий T
. IsGenericTypeDefinition
проверяет, что общий T
НЕ был определен. Это полезно, если вы хотите узнать, определены ли два объекта из одного и того же базового универсального типа, например, в первом примере List
.