2009-09-16 5 views

Antwort

21

Type.IsSubclassOf() Bestimmt, ob die durch den aktuellen Typ dargestellte Klasse von der durch den angegebenen Typ dargestellten Klasse abgeleitet ist.

+1

Hmm ... Das sollte auch gut funktionieren. Jetzt bin ich neugierig, was ist der Unterschied zwischen Type.IsAssgnableFrom und Type.IsSubclassOf? – sh0gged

+1

type1.IsAssignableFrom (type2) funktioniert, wenn type1 eine Schnittstelle ist –

+0

Jetzt denke ich, dass Type.IsSubclassOf() ist mehr wie ich suchte. :) Vielen Dank. – sh0gged

14

Sie suchen wahrscheinlich nach Type.IsAssignableFrom.

+0

Yeap, das funktioniert für mich. Vielen Dank! – sh0gged

+0

Dies ist nützlich, aber es wird 'true' zurückgegeben, wenn beide Typen gleich sind. Es gibt einige Unterschiede zwischen Zuordnungskompatibilität und Vererbung. Ich finde es auch schwieriger zu lesen als 'IsSubClassOf'. – Sam

0

Ich glaube, Sie sind für diese Suche Type.IsSubclassOf()

Edit:

Ich weiß nicht, Ihre Anforderungen, aber das ist der beste Weg sein kann:

bool isDescendant = cValue is C; 
+1

Ich denke im Falle von System.Type, die einfach nicht funktioniert. – sh0gged

5

Ich weiß, dies nicht Beantworten Sie Ihre Frage direkt, aber Sie könnten dies anstelle der Methode in Ihrem Beispiel in Betracht ziehen:

public static bool IsDescendantOf<T>(this object o) 
{ 
    if(o == null) throw new ArgumentNullException(); 
    return typeof(T).IsSubclassOf(o.GetType()); 
} 

So können Sie es wie folgt verwenden:

C c = new C(); 
c.IsDescendantOf<A>(); 

, auch Ihre Frage über den Unterschied zwischen Type.IsSubclassOf und Type.IsAssignableFrom zu beantworten - IsAssignableFrom ist im Sinne schwächer, wenn man zwei Objekte a und b so dass dieser gültig ist:

a = b; 

Dann typeof(A).IsAssignableFrom(b.GetType()) wahr ist - eine könnte so eine Unterklasse von b, oder eine Schnittstelle Typ sein.

Im Gegensatz dazu würde a.GetType().IsSubclassOf(typeof(B)) nur wahr zurückgeben, wenn a eine Unterklasse von b wäre. Angesichts des Namens Ihrer Erweiterungsmethode würde ich sagen, dass Sie IsSubclassOf anstelle von IsAssignable verwenden sollten;

+0

Guter Punkt. Vielen Dank. – sh0gged

+0

Ist Ihr vorletzter Absatz korrekt? Ich dachte 'a.GetType(). IsAssignableFrom (typeof (b))' wäre wahr, wenn 'a = b;' gültig wäre. – Sam

+0

@Sam - Ja, du hast Recht, danke. – Lee

Verwandte Themen