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)?
Respuesta
Utilice el método IsSubclassOf de la clase System.Type.
¿Funcionará esto a través de las interfaces también? –
Para interfaces, existe el método GetInterface – chakrit
Entonces ... esto no responde completamente la pregunta. No funcionaría si el tipo a implementa la interfaz b –
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).
Sí, a diferencia de Type.IsSubclassOf, esto también funciona en interfaces. –
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
Muy bien escrito. Me ha ayudado :-) gracias. –
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
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. –
- 1. ¿Cómo comprobar si una clase hereda otra clase sin instanciarla?
- 2. ¿Cómo se determina la clase de un tipo genérico?
- 3. ¿Cómo puedo determinar si System.Type es un tipo personalizado o un tipo de Framework?
- 4. ¿Cómo se determina si ParameterInfo es de tipo genérico?
- 5. ¿Es posible verificar si una función miembro está definida para una clase incluso si el miembro se hereda de una clase base desconocida?
- 6. Ruby hereda la clase
- 7. ¿Cómo saber si un tipo es una clase estática?
- 8. ¿Cómo se determina si ACE o JET en una máquina con Windows usa .net?
- 9. clase VB.NET hereda una clase base e implementa un problema de interfaz (funciona en C#)
- 10. obtener tipo de clase base en python
- 11. ¿Cómo se determina si una lista bidimensional contiene un valor?
- 12. ¿Cómo puedo saber si un elemento contiene una clase específica?
- 13. ¿Cómo podría saber si un objeto se deriva de una clase genérica específica?
- 14. ¿Cómo verificar si un tipo sobrecarga/admite un determinado operador?
- 15. ¿Hereda de una clase base que implementa INotifyPropertyChanged?
- 16. Cómo saber si una instancia pertenece a un determinado Tipo o cualquier tipo derivado
- 17. ¿Cómo puedo determinar si una clase A hereda de la clase B sin instanciar un objeto A en Ruby?
- 18. git ignorar todos los archivos de un tipo determinado, excepto aquellos en una subcarpeta específica
- 19. genérico Clase base que hereda de la interfaz genérica
- 20. mensaje Protobuf-Net de error: No se Serializador definido para el tipo: System.Type
- 21. Cómo encontrar si un método está implementando una interfaz específica
- 22. Comprueba si el argumento de la plantilla se hereda de la clase
- 23. ¿Cómo se determina si CKEditor está cargado?
- 24. compruebe si el archivo es de un tipo determinado
- 25. cómo obtener el valor predeterminado de un tipo si el tipo solo se conoce como Tipo de sistema?
- 26. Unidad probando una clase que hereda de una clase abstracta
- 27. mejor manera de comprobar si System.Type es un descendiente de una clase dada
- 28. ¿Cómo determinar si un tipo .NET es una estructura personalizada?
- 29. ¿Determina si una aplicación está bloqueada/ocupada?
- 30. Burlarse de una clase que hereda de otra clase
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. –