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?

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top