Sprawdzenie, czy klasa dziedziczy po klasie

0

Cześć, mam taką sytuację:

 
class Base {}
class Derived: Base {}
class D: Derived{}

Teraz musze sprawdzić, czy klasa D dziedziczy po Base. Próbowałem z użyciem: Type.IsAssignableFrom i Type.IsSubclassOf ale obie te metody zwracają false. W jaki sposób mogę sprawdzić, czy D dziedziczy po Base?

0

Nie można w taki sposób porównać dwóch klas. W taki sposób można porównać obiekt z klasą:

D obj = new D();
if(obj is Base)
{
}
0

Ja tylko zapytam co próbujesz zrobić? Prawie na pewno można to zrobić inaczej niż przez ręczne sprawdzanie zależności dziedziczenia.
Przykładowo w generics możesz określić wymaganą klasę bazową albo wymagany interfejs.

0

Wiedziałem, że wreszcie ktoś się czepi ;) Nie mogę tego zrobić inaczej. Chodzi o to, że w pewnym namespacie mam podefiniowane różne klasy. I w pewnym momencie muszę stworzyć obiekty klas, które dziedziczą po konkretnej klasie. To jest w pewnym sensie fabryka. Jednak chodzi o to, że ilość tych klas będzie rosła, więc zrobiłem sobie taki automat, że przelatuję wszystkie typy zdefiniowane w tym konkretnym namespecie i jeśli dany typ spełnia określone warunki, to tworzę obiekt. Mogę to zrobić na kilka sposobów:

  1. Tak, jak próbuję :)
  2. Klasy, które faktycznie mają być instan... instancjonowane (?) muszą być w osobnym namespace (ale to na bank się nie uda)
  3. Mogę dodać do klas, które mają być faktycznie instancjonowane konkretny atrybut. I w ten sposób to ogarniam teraz. Jednak ma to taki minus, że twórcy przyszłych klas muszą o tym atrybucie pamiętać :)
1

Nie wiem co ci niby nie działa: https://ideone.com/Oao9FX

0

Juhas, toż to pięć minut pracy z debugerem jest

var type = typeof(D);
var directlyInheritsDerivedClass = type.BaseType == typeof(Derived); // true
var inheritsFromBaseClass = type.IsSubclassOf(typeof(Base)); // true

Jeśli Tobie Type.IsSubclassOf() zwróciło false, to coś spieprzyłeś, bo IsSubclassOf to nie metoda statyczna. Zakładając, że to był skrót myślowy, to też coś spieprzyłeś, bo mi typeof(D).IsSubclassOf(typeof(Base)) zwraca true.

0

Kurcze, faktycznie. Podczas pierwszego testu coś mi musiało umknąć. IsSubclassOf załatwia sprawę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1