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;
}
IsInstanceOfType
passen?quelle
Sie sollten stattdessen Type.IsAssignableFrom verwenden.
quelle
Wenn Sie versuchen, dies in einem Xamarin Forms PCL-Projekt zu tun, geben die oben genannten Lösungen
IsAssignableFrom
einen Fehler aus:weil
IsAssignableFrom
nach einemTypeInfo
Objekt fragt . Sie können dieGetTypeInfo()
Methode verwenden vonSystem.Reflection
:typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
quelle
Ich poste diese Antwort in der Hoffnung, dass jemand mit mir teilt, ob und warum es eine schlechte Idee wäre. In meiner Anwendung habe ich eine Eigenschaft vom Typ Typ, die ich überprüfen möchte, um sicherzustellen, dass es sich um den Typ (A) oder den Typ (B) handelt, wobei B eine von A abgeleitete Klasse ist. Also mein Code:
Ich fühle mich hier vielleicht ein bisschen naiv, daher wäre jedes Feedback willkommen.
quelle