Me gustaría realizar una prueba si un objeto es de tipo genérico. He intentado lo siguiente sin éxito:
public bool Test()
{
List<int> list = new List<int>();
return list.GetType() == typeof(List<>);
}
¿Qué estoy haciendo mal y cómo realizo esta prueba?
Supongo que no solo quiere saber si el tipo es genérico, sino si un objeto es una instancia de un tipo genérico particular, sin conocer los argumentos de tipo.
No es terriblemente simple, desafortunadamente. No es tan malo si el tipo genérico es una clase (como lo es en este caso) pero es más difícil para las interfaces. Aquí está el código para una clase:
EDITAR: Como se señaló en los comentarios, esto puede funcionar para las interfaces:
Tengo la sospecha de que puede haber algunos casos incómodos al respecto, pero no puedo encontrar uno por el que falle en este momento.
fuente
List<T>
de una forma u otra. Si incluye interfaces, es realmente complicado.IsInstanceOfGenericType
con una llamada a enIsAssignableFrom
lugar del operador de igualdad (==
)?Puede usar código más corto usando dinámico aunque esto puede ser más lento que la reflexión pura:
fuente
Estos son mis dos métodos de extensión favoritos que cubren la mayoría de los casos extremos de verificación de tipos genéricos:
Funciona con:
Tiene una sobrecarga que 'eliminará' el tipo genérico específico si devuelve verdadero (consulte la prueba unitaria para obtener muestras):
Aquí hay una prueba para demostrar la funcionalidad (básica):
fuente
fuente