Der beste Weg, wenn System.Type zu überprüfen, ist ein Nachkomme einer bestimmten Klasse
-
07-07-2019 - |
Frage
Betrachten Sie den folgenden Code ein:
public class A
{
}
public class B : A
{
}
public class C : B
{
}
class D
{
public static bool IsDescendantOf(this System.Type thisType, System.Type thatType)
{
/// ???
}
void Main()
{
A cValue = new C();
C.GetType().IsDescendantOf(cValue.GetType());
}
}
Was ist der beste Weg, IsDescendantOf zu implementieren?
Lösung
Type.IsSubclassOf () Bestimmt, ob das Klasse von der aktuellen Type ergibt sich aus der vom angegebenen Typ repräsentiert Klasse dargestellt.
Andere Tipps
Sie suchen wahrscheinlich für Type.IsAssignableFrom .
Ich weiß, das beantwortet nicht direkt auf Ihre Frage, aber Sie könnten mit diesem anstelle des Verfahrens in Ihrem Beispiel betrachten:
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 verwendet werden:
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 diese gilt:
a = b;
Dann typeof(A).IsAssignableFrom(b.GetType())
ist wahr - so ein eine Unterklasse von b sein könnte, oder ein Schnittstelle Typ
Im Gegensatz dazu würde a.GetType().IsSubclassOf(typeof(B))
nur wahr zurück, wenn eine Unterklasse von b sind. In Anbetracht der Name Ihrer Erweiterung Methode, ich würde sagen, Sie IsSubclassOf statt IsAssignable verwenden sollte;
Ich glaube, Sie für diese Type.IsSubclassOf ( )
Edit:
Ich weiß nicht, Ihre Anforderungen kann aber das ist der beste Weg sein:
bool isDescendant = cValue is C;