2013-04-16 7 views
18

Betrachten Sie die folgenden Klassen-Hierarchie: Basisklasse A, Klasse B und C von A geerbt und Klasse D geerbt von B.Wie alle direkten Subklassen einer Klasse mit .NET Reflexion finden

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

ich verwenden kann, folgender Code alle Unterklassen von A einschließlich D zu finden:

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

Aber ich brauche nur direkte Unterklassen von A (B und C in Beispiel) und schließt alle Klassen nicht direkt geerbt von A (wie D) zu finden. Irgendeine Idee, wie man das macht?

Antwort

23

Für jede dieser Arten, ob

type.BaseType == typeof(A) 

Oder Sie es direkt inline setzen können:

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

Nicht sicher, ob Sie 'typeof (t)' dort wollen; führt dies nicht zu 'System.Type', da' t' bereits der 'System.Type' ist, der' A', 'B',' D' usw. repräsentiert? EDIT: Nein, ich bin dumm, das ist nur ein Compilerfehler! –

+0

@ChrisSinclair: Geändert, um 'type' und' t' direkt zu verwenden. Vielen Dank; Habe VS nicht vor mir zu verifizieren. – zimdanen

+1

danke! Ich habe die BaseType-Eigenschaft verpasst. Darüber hinaus jede Idee, wie alle ersten nicht-abstrakten Unterklassen einer Klasse zu bekommen? In meinem Beispiel, wenn B abstrakt ist, dann will ich C und D. – mykola

3

Man vergleiche nur angemessen:

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

Ich denke nicht, dass das richtig ist - das würde keine zurückgeben, vorausgesetzt, wir suchen nach Abkömmlingen von 'A', weil' A.BaseType' 'Objekt' ist (siehe ** Toni Petrina ** 's Antwort für die Dokumentation dazu). Dies sollte "t.BaseType == baseType" oder kompilieren gleichwertig sein. – zimdanen

+0

Richtig. Ging nicht aufmerksam, nachdem die erste Antwort kam. – Euphoric

5

Verwenden Type.BaseType Das. Aus der Dokumentation:

Der Basistyp ist der Typ, von dem der aktuelle Typ direkt erbt. Objekt ist der einzige Typ, der keinen Basistyp hat, daher wird als Basistyp von Object null zurückgegeben.

Verwandte Themen