Come si determina se un determinato tipo (System.Type) eredita o meno da una classe base specifica (in .Net)?
-
02-07-2019 - |
Domanda
Questa sarà probabilmente una risposta facile e mi manca qualcosa, ma qui va ... Se ho un tipo, (cioè un vero System.Type ... non un'istanza) come si fa Dico se eredita da un altro tipo di base specifico?
Soluzione
Utilizza il metodo IsSubclassOf del System.Type class.
Altri suggerimenti
Una cosa da chiarire tra Type.IsSubTypeOf ()
e Type.IsAssignableFrom ()
:
IsSubType ()
restituiràtrue
solo se il tipo dato è derivato da il tipo specificato. Restituiràfalse
se il tipo specificato È il tipo specificato.IsAssignableFrom ()
restituiràtrue
se il tipo specificato è tipo specificato o derivato dal tipo specificato.
Quindi, se li stai usando per confrontare BaseClass
e DerivedClass
(che eredita da BaseClass
), allora:
BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE
EDIT: Nota che la soluzione di cui sopra fallirà se il tipo di base che stai cercando è un'interfaccia. La seguente soluzione funzionerà per qualsiasi tipo di eredità, sia essa classe o interfaccia.
// Returns true if "type" inherits from "baseType"
public static bool Inherits(Type type, Type baseType) {
return baseType.IsAssignableFrom(type)
}
(Semi) Estratto utile da MSDN articolo:
vero se [l'argomento] e il Tipo corrente rappresentano lo stesso tipo, o se il Tipo corrente è nella gerarchia ereditaria di [l'argomento], o se il Tipo corrente è un'interfaccia che [l'argomento] implementa, oppure se [l'argomento] è un parametro di tipo generico e il tipo corrente rappresenta uno dei vincoli di [l'argomento]. false se nessuna di queste condizioni è vera o se [l'argomento] è riferimento null (Nothing in Visual Basic).