2012-01-02 18 views
95

Supponiamo che ho una classe che assomiglia a questo:Come verificare se una classe eredita un'altra classe senza istanziarla?

class Derived : // some inheritance stuff here 
{ 
} 

voglio verificare qualcosa di simile nel mio codice:

Derived is SomeType; 

ma sembra che necessità is operatore legnosi da variabile di tipo Dervied , non derivato stesso. Non voglio creare un oggetto di tipo Derivato.
Come posso essere sicuro che Derived erediti SomeType senza istanziarlo?

P.S. Se aiuta, voglio qualcosa di simile a ciò che la parola chiave where fa con i generici.
MODIFICA:
simile alla risposta this, ma sta controllando un oggetto. Voglio controllare la classe stessa.

risposta

207

Per verificare la presenza di cedibilità di questo, è possibile utilizzare il metodo Type.IsAssignableFrom:

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

Ciò funzionerà come ci si aspetta per l'uguaglianza di tipo, le relazioni di ereditarietà e le implementazioni dell'interfaccia ma non quando si cerca "assegnabilità" tra operatori di conversione espliciti/impliciti.

Per verificare la presenza di rigorosa eredità, è possibile utilizzare Type.IsSubclassOf:

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

Proprio come una nota a chiunque altro chiedendo, questo non restituirà vero quando il controllo contro le definizioni generiche tipo/interfaccia, per quanto posso dire che è necessario cercare la catena di ereditarietà e controllare da soli le definizioni di tipo generico. –

+0

Alex, come andresti a cercare la catena ereditaria di un tipo generico per realizzare questo? –

+0

@ AlexHopeO'Connor's note è importante e penso che la soluzione sia lì http://stackoverflow.com/questions/457676/check-if-a-class-is-derived-from-a-generic-class –

18

Prova questa

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

Questo vi dirà se BarClass(Derived) implementa IFoo(SomeType) o no

Problemi correlati