2012-01-02 26 views
95

Supongamos que tengo una clase que tiene este aspecto:¿Cómo comprobar si una clase hereda otra clase sin instanciarla?

class Derived : // some inheritance stuff here 
{ 
} 

Quiero ver algo como esto en mi código:

Derived is SomeType; 

Pero parece que la necesidad is operador Derivado ser variable de tipo Dervied , no derivado en sí mismo. No quiero crear un objeto de tipo Derivado.
¿Cómo puedo asegurarme de que Derived hereda SomeType sin instanciarlo?

P.S. Si ayuda, quiero algo como lo que hace la palabra clave where con genéricos.
EDIT:
similares a this respuesta, pero está comprobando un objeto. Quiero verificar la clase en sí.

Respuesta

207

para comprobar si hay transferible del mismo, se puede utilizar el Type.IsAssignableFrom método:

typeof(SomeType).IsAssignableFrom(typeof(Derived)) 

Esto funcionará esperas para tipo-igualdad, relaciones de herencia e implementaciones de interfaz, pero no cuando busca 'asignabilidad' en operadores de conversión explícita/implícita.

Para comprobar si hay herencia estricta, puede utilizar Type.IsSubclassOf:

typeof(Derived).IsSubclassOf(typeof(SomeType)) 
+1

Así como una nota a otra persona preguntando, esto no volverá cierto cuando la comprobación frente a las definiciones de tipo/interfaz genérica, en la medida de lo que pueda Dígale que necesita buscar en la cadena de herencia y verificar las definiciones de tipo genérico usted mismo. –

+0

Alex, ¿cómo harías para buscar la cadena de herencia de un tipo genérico para lograr esto? –

+0

@ La nota de AlexHopeO'Connor es importante y creo que la solución está ahí http://stackoverflow.com/questions/457676/check-if-a-class-is-derived-from-a-generic-class –

18

Prueba este

typeof(IFoo).IsAssignableFrom(typeof(BarClass)); 

Esto le dirá si BarClass(Derived) implementa IFoo(SomeType) o no

Cuestiones relacionadas