Domanda

Considera il seguente codice:

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());
    }
}

Qual è il modo migliore per implementare IsDescendantOf?

È stato utile?

Soluzione

Type.IsSubclassOf () Determina se l'oggetto la classe rappresentata dal tipo corrente deriva dalla classe rappresentata dal tipo specificato.

Altri suggerimenti

Probabilmente stai cercando Type.IsAssignableFrom .

Mi rendo conto che questo non risponde direttamente alla tua domanda, ma potresti prendere in considerazione l'utilizzo di questo invece del metodo nel tuo esempio:

public static bool IsDescendantOf<T>(this object o)
{
    if(o == null) throw new ArgumentNullException();
    return typeof(T).IsSubclassOf(o.GetType());
}

Quindi puoi usarlo in questo modo:

C c = new C();
c.IsDescendantOf<A>();

Inoltre, per rispondere alla tua domanda sulla differenza tra Type.IsSubclassOf e Type.IsAssignableFrom - IsAssignableFrom è più debole nel senso che se hai due oggetti aeb in modo che ciò sia valido:

a = b;

Quindi typeof (A) .IsAssignableFrom (b.GetType ()) è true - quindi a potrebbe essere una sottoclasse di b o un tipo di interfaccia.

Al contrario, a.GetType (). IsSubclassOf (typeof (B)) restituirà vero solo se a fosse una sottoclasse di b. Dato il nome del tuo metodo di estensione, direi che dovresti usare IsSubclassOf invece di IsAssignable a;

Penso che tu stia cercando questo Type.IsSubclassOf ( )

Modifica:

Non conosco i tuoi requisiti ma potrebbe essere il modo migliore:

bool isDescendant = cValue is C;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top