2012-01-02 24 views
95

Załóżmy, że mam klasy, która wygląda tak:Jak sprawdzić, czy klasa dziedziczy inną klasę bez tworzenia instancji?

class Derived : // some inheritance stuff here 
{ 
} 

Chcę sprawdzić, czy coś takiego w moim kodu:

Derived is SomeType; 

Ale wygląda potrzebie is operatora Wyprowadzony być zmienna typu Dervied , nie jest sam pochodną. Nie chcę tworzyć obiektu typu pochodnego.
Jak mogę się upewnić, że Derived dziedziczy SomeType bez tworzenia instancji?

P.S. Jeśli to pomaga, chcę coś, co robi słowo kluczowe where z rodzajami.
EDYCJA:
Podobna do this odpowiedź, ale sprawdza obiekt. Chcę sprawdzić samą klasę.

Odpowiedz

207

Aby sprawdzić zbywalności, można użyć metody Type.IsAssignableFrom:

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

to będzie działać jako oczekujesz równości typów, relacji dziedziczenia i implementacji interfejsu, ale nie, gdy szukasz "możliwości przypisania" przez jawnych/niejawnych operatorów konwersji.

Aby sprawdzić ścisłym dziedziczenia, można użyć Type.IsSubclassOf:

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

Podobnie jak notatki nikomu zastanawiać, to nie zwróci true podczas sprawdzania przed definicjami typ/interfejsów generycznych, o ile mogę powiedz, że musisz przeszukać łańcuch dziedziczenia i samemu sprawdzić ogólne definicje typów. –

+0

Alex, jak byś poszła na wyszukiwanie łańcucha dziedziczenia typu ogólnego, aby to osiągnąć? –

+0

@ Uwaga AlexHopeO'Connor jest ważne i myślę, że istnieje rozwiązanie http://stackoverflow.com/questions/457676/check-if-a-class-is-derived-f--eneric-class –

18

Spróbuj

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

To powie Ci, czy BarClass(Derived) realizuje IFoo(SomeType) lub nie

Powiązane problemy