2008-09-24 21 views
23

Probablemente esta sea una respuesta fácil y me falta algo, pero aquí va ... Si tengo un Type (es decir, un System.Type real ... no una instancia) ¿cómo puedo decir si hereda de otro tipo base específico?¿Cómo se determina si un tipo determinado (System.Type) hereda de una clase base específica (en .Net)?

+2

Tenga en cuenta que el [Type.IsSubclassOf] (http://msdn.microsoft.com /en-us/library/system.type.issubclassof.aspx) ¡el método no funciona para los tipos genéricos! [** Eche un vistazo a este artículo **] (http://www.pvladov.com/2012/05/get-all-derived-types-of-class.html) para una implementación del método IsSubclassOf que funciona para genéricos también. –

Respuesta

31

Utilice el método IsSubclassOf de la clase System.Type.

+0

¿Funcionará esto a través de las interfaces también? –

+0

Para interfaces, existe el método GetInterface – chakrit

+0

Entonces ... esto no responde completamente la pregunta. No funcionaría si el tipo a implementa la interfaz b –

22

EDITAR: Tenga en cuenta que la solución anterior fallará si el tipo base que está buscando es una interfaz. La siguiente solución funcionará para cualquier tipo de herencia, ya sea clase o interfaz.

// Returns true if "type" inherits from "baseType" 
public static bool Inherits(Type type, Type baseType) { 
    return baseType.IsAssignableFrom(type) 
} 

(Semi) extracto útil del artículo de MSDN:

cierto si [el argumento] y el tipo de corriente representan el mismo tipo, o si el tipo actual está en la jerarquía de herencia de [el argumento ], o si el Tipo actual es una interfaz que [el argumento] implementa, o si [el argumento] es un parámetro de tipo genérico y el Tipo actual representa una de las restricciones de [el argumento]. falso si ninguna de estas condiciones es verdadera, o si [el argumento] es una referencia nula (Nothing en Visual Basic).

+0

Sí, a diferencia de Type.IsSubclassOf, esto también funciona en interfaces. –

22

Una cosa a aclarar entre Type.IsSubTypeOf() y Type.IsAssignableFrom():

  • IsSubType() volverá true sólo si el tipo dado se deriva de del tipo especificado. Devolverá false si el tipo especificado ES el tipo especificado.

  • IsAssignableFrom() devolverá true si el tipo proporcionado es el tipo especificado o derivado del tipo especificado.

Así que si usted está utilizando éstos para comparar BaseClass y DerivedClass (que hereda de BaseClass) a continuación:

BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE 
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE 

DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE 
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE 
+0

Muy bien escrito. Me ha ayudado :-) gracias. –

+8

En realidad, DerivedClassInstance.GetType.IsAssignableFrom (GetType (BaseClass)) devolverá FALSE. Debe aplicarlo al revés: typeof (BaseClass) .IsAssignableFrom (typeof (DerivedClass)).En otras palabras, no puede hacer lo siguiente: DerivedClass c = new BaseClass(); Que es lo que IsAssignableFrom está probando – jspaey

+0

si solo tiene el tipo en su mano. Tales como 'propertyInfo.PropertyType' ¿cómo se puede determinar si una interfaz implementada de este tipo? IsAssignableFrom simplemente da compatibilidad entre ellos. Para dar un ejemplo más claro, no pude encontrar si un tipo es realmente y exactamente IList sobre un tipo de lista. Podría ser otra cosa impulsada desde IList. Esto debería ser un problema polimórfico. –

Cuestiones relacionadas