.net - parameter - ¿Cuál es la diferencia entre un tipo genérico y una definición de tipo genérico?
reflection c# (2)
Estoy estudiando sobre la reflexión de .net y me está costando descubrir la diferencia.
Por lo que entiendo, List<T>
es una definición de tipo genérico. ¿Eso significa que para .net la reflexión T es el tipo genérico?
Específicamente, creo que estoy buscando más antecedentes sobre las funciones Type.IsGenericType y Type.IsGenericTypeDefinition.
¡Gracias!
En su ejemplo, la List<T>
es una definición de tipo genérico. T
se llama un parámetro de tipo genérico. Cuando el parámetro type se especifica como en List<string>
o List<int>
o List<double>
entonces tiene un tipo genérico. Puedes verlo ejecutando un código como este ...
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);
}
Que se imprimirá
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.
Otra forma de obtener la definición de tipo genérico directamente es typeof(List<>)
o typeof(Dictionary<,>)
.
Esto ayudará a explicarlo tal vez:
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.");
}
Si lo ejecuta, obtendrá la primera prueba para pasar porque ambos elementos están implementando el tipo List<T>
. La segunda prueba falla porque List<string>
no es lo mismo que List<int>
. La definición de tipo genérico está comparando el genérico original antes de definir T
El tipo IsGenericType
solo está verificando si se ha definido la T
genérica. IsGenericTypeDefinition
verifica que la T
genérica NO haya sido definida. Esto es útil si desea saber si dos objetos se han definido a partir del mismo tipo genérico base, como el primer ejemplo de List<T>
.