2013-04-16 15 views
18

Rozważmy następujące klasy hierarchia: podstawa klasy A, klasy B i C dziedziczone z klasy D i odziedziczone B.Jak znaleźć wszystkie bezpośrednie podklasy klasy z .NET Odbicie

public class A  {...} 
public class B : A {...} 
public class C : A {...} 
public class D : B {...} 

mogę użyć Poniższy kod, aby znaleźć wszystkie podklasy a w tym D:

var baseType = typeof(A); 
var assembly = typeof(A).Assembly; 
var types = assembly.GetTypes().Where(t => t.IsSubclassOf(baseType)); 

Ale muszę znaleźć tylko bezpośrednie podklasy a (B i C na przykład) i uwzględniają wszystkie klasy nie bezpośrednio dziedziczone z (takie jak D). Każdy pomysł, jak to zrobić?

Odpowiedz

23

dla każdego z tych typów, sprawdź czy

type.BaseType == typeof(A) 

Albo można umieścić go bezpośrednio inline:

var types = assembly.GetTypes().Where(t => t.BaseType == typeof(baseType)); 
+1

Nie jestem pewien, czy chcesz użyć 'typeof (t)'; nie spowoduje to 'System.Type', ponieważ' t' jest już 'System.Type' reprezentujący' A', 'B',' D', etc? EDIT: Nie, jestem głupi, to zamiast tego błąd kompilatora! –

+0

@ChrisSinclair: Zmieniono używanie bezpośrednio 'type' i' t'. Dzięki; nie mam przed sobą VS, żeby zweryfikować w tej chwili. – zimdanen

+1

dzięki! Opuściłem właściwość BaseType. Dodatkowo, jakikolwiek pomysł jak zdobyć wszystkie pierwsze nie abstrakcyjne podklasy klasy? W mojej próbce, jeśli B jest abstrakcyjna, chcę C i D. – mykola

3

Wystarczy porównać je odpowiednio:

var types = assembly.GetTypes().Where(t => t.BaseType == baseType); 
+0

Nie sądzę, że to jest poprawne - to nie zwróci żadnego, zakładając, że szukamy potomków 'A', ponieważ' A.BaseType' to 'Obiekt' (patrz ** odpowiedź Toni Petrina ** dla dokumentacja na ten temat). Powinno to być 't.BaseType == baseType' lub kompilować odpowiednik. – zimdanen

+0

Dobrze. Nie zwróciłem uwagi po otrzymaniu pierwszej odpowiedzi. – Euphoric

5

Korzystając Type.BaseType dla że. Z dokumentacji:

Typ bazowy to typ, z którego bieżący typ bezpośrednio dziedziczy. Obiekt jest jedynym typem, który nie ma typu podstawowego, dlatego null jest zwracany jako podstawowy typ obiektu.

Powiązane problemy