Offensichtlich nicht.
Hier sind die Optionen:
Type.IsSubclassOf
Wie Sie bereits herausgefunden haben, funktioniert dies nicht, wenn die beiden Typen gleich sind, hier ein Beispiel LINQPad Programm, das demonstriert:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Ausgabe:
True
False
Dies bedeutet, dass Derived
ist eine Unterklasse von Base
sondern dass Base
ist (offensichtlich) nicht eine Unterklasse von sich selbst.
Type.IsAssignableFrom
Dies wird Ihre Frage beantworten, aber es wird Ihnen auch falsch positive Ergebnisse liefern. Wie Eric Lippert in den Kommentaren dargelegt hat, gibt die Methode zwar tatsächlich True
für die beiden oben genannten Fragen, gibt sie auch True
für diese, was Sie wahrscheinlich nicht wollen:
void Main()
{
typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}
public class Base { }
public class Derived : Base { }
Hier erhalten Sie die folgende Ausgabe:
True
True
True
Die letzte True
würde darauf hindeuten, wenn die Methode nur die gestellte Frage beantwortet hat, dass uint[]
erbt von int[]
oder dass es sich um den gleichen Typ handelt, was eindeutig nicht der Fall ist.
Also IsAssignableFrom
ist auch nicht ganz korrekt.
is
y as
Das "Problem" mit is
y as
im Zusammenhang mit Ihrer Frage ist, dass Sie mit den Objekten operieren und einen der Typen direkt in den Code schreiben müssen, und nicht mit Type
Objekte.
Mit anderen Worten: Es lässt sich nicht kompilieren:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
Und das hier auch nicht:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
Und das hier auch nicht:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Schlussfolgerung
Obwohl die oben genannten Methoden für Ihre Bedürfnisse geeignet sein könnten, ist die einzig richtige Antwort auf Ihre Frage (so wie ich sie sehe), dass Sie eine zusätzliche Prüfung benötigen:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
was natürlich in einer Methode mehr Sinn macht:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}