Come si determina se un determinato tipo (System.Type) eredita o meno da una classe base specifica (in .Net)?

StackOverflow https://stackoverflow.com/questions/129277

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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top