Wie bestimmen Sie, ob eine gegebene Art (System.Type) von einer bestimmten Basisklasse erbt (in .NET)?

StackOverflow https://stackoverflow.com/questions/129277

Frage

Das wird wahrscheinlich eine einfache Antwort sein, und ich bin nur etwas fehlt, aber hier geht ... Wenn ich einen Typ haben, (das heißt, eine tatsächliche System.Type ... keine Instanz) wie tun ich sage, wenn es von einem anderen bestimmten Basistyp erbt?

War es hilfreich?

Lösung

Mit der IsSubclassOf Methode der System.Type Klasse.

Andere Tipps

Eine Sache zu klären zwischen Type.IsSubTypeOf() und Type.IsAssignableFrom():

  • IsSubType() kehrt true nur, wenn der angegebene Typ abgeleitet ist der angegebene Typ. Es wird wieder false, wenn der angegebene Typ der angegebene Typ.

  • IsAssignableFrom() kehrt true, wenn der angegebene Typ ist entweder der Typ oder abgeleitet von dem angegebenen Typ angegeben.

Also, wenn Sie verwenden diese BaseClass und DerivedClass (die von BaseClass erbt) zu vergleichen, dann:

BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE

DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE

EDIT: Beachten Sie, dass die oben genannte Lösung wird scheitern, wenn der Basistyp Sie suchen, eine Schnittstelle. Die folgende Lösung wird für jede Art von Vererbung arbeiten, sei es Klasse oder Schnittstelle.

// Returns true if "type" inherits from "baseType"
public static bool Inherits(Type type, Type baseType) {
    return baseType.IsAssignableFrom(type)
}

(Semi) Hilfreiche Auszug aus dem MSDN Artikel:

true, wenn [das Argument] und die aktuelle Type repräsentieren die gleiche Art, oder wenn der aktuelle Typ in der Vererbungshierarchie ist [Argument], oder wenn der aktuelle Typ ist eine Schnittstelle, die [das Argument] implementiert, oder wenn [das Argument] ist ein generischer Typ-Parameter und die aktuelle Type stellt eine der Beschränkungen des [Arguments]. false, wenn keine dieser Bedingungen erfüllt ist, oder wenn [das Argument] ist ein NULL-Verweis (Nothing in Visual Basic).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top