Anscheinend nein.
Hier sind die Optionen:
Type.IsSubclassOf
Wie Sie bereits herausgefunden haben, funktioniert dies nicht, wenn die beiden Typen identisch sind. Hier ist ein Beispiel für ein LINQPad- Programm, das Folgendes 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
Was darauf hinweist, dass dies Derived
eine Unterklasse von ist Base
, aber das Base
ist (offensichtlich) keine Unterklasse von sich.
Type.IsAssignableFrom
Dies wird Ihre spezielle Frage beantworten, aber es wird Ihnen auch falsch positive Ergebnisse liefern. Wie Eric Lippert in den Kommentaren ausgeführt hat, wird die Methode zwar True
für die beiden oben genannten Fragen zurückkehren, aber auch True
für diese, die 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 folgende Ausgabe:
True
True
True
Das letzte True
dort würde anzeigen, wenn die Methode nur die gestellte Frage beantwortet, uint[]
die von int[]
oder vom gleichen Typ erbt , was eindeutig nicht der Fall ist.
Ist IsAssignableFrom
also auch nicht ganz richtig.
is
und as
Das "Problem" mit is
und as
im Kontext Ihrer Frage besteht darin, dass Sie die Objekte bearbeiten und einen der Typen direkt in Code schreiben müssen und nicht mit Type
Objekten arbeiten müssen.
Mit anderen Worten, dies wird nicht kompiliert:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
noch wird dies:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
noch wird dies:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Fazit
Während die oben genannten Methoden möglicherweise Ihren Anforderungen entsprechen, ist die einzig richtige Antwort auf Ihre Frage (wie ich es sehe), dass Sie eine zusätzliche Prüfung benötigen:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
was in einer Methode natürlich sinnvoller ist:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}