.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> .