2009-09-16 10 views

risposta

21

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

+1

Hmm ... Anche questo dovrebbe funzionare bene. Ora sono curioso di sapere qual è la differenza tra Type.IsAssgnableFrom e Type.IsSubclassOf? – sh0gged

+1

type1.IsAssignableFrom (type2) funzionerà se type1 è un'interfaccia –

+0

Ora suppongo che Type.IsSubclassOf() sia più simile a quello che stavo cercando. :) Grazie. – sh0gged

14

Probabilmente stai cercando Type.IsAssignableFrom.

+0

Yeap, che funziona per me. Grazie! – sh0gged

+0

Questo è utile, ma restituirà 'true' se entrambi i tipi sono uguali. Ci sono alcune differenze tra compatibilità di assegnazione ed ereditarietà. Trovo anche più difficile leggere di 'IsSubClassOf'. – Sam

0

penso che siete alla ricerca di questo Type.IsSubclassOf()

Edit:

Non so le vostre esigenze, ma può essere questo è il modo migliore:

bool isDescendant = cValue is C; 
+1

Penso che in System.Type non funzioni. – sh0gged

5

Mi rendo conto che non è così rispondi direttamente alla tua domanda, ma potresti prendere in considerazione l'utilizzo di questa opzione 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()); 
} 

Così si può usare in questo modo:

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

Inoltre, per rispondere alla tua domanda circa la differenza tra Type.IsSubclassOf e Type.IsAssignableFrom - IsAssignableFrom è più debole, nel senso che se si dispone di due oggetti A e B in modo tale che questo è valido:

a = b; 

Poi typeof(A).IsAssignableFrom(b.GetType()) è vero - in modo da un potrebbe essere una sottoclasse di B, o di un tipo di interfaccia.

Al contrario, a.GetType().IsSubclassOf(typeof(B)) restituirebbe true solo se a era una sottoclasse di b. Dato il nome del tuo metodo di estensione, direi che dovresti usare IsSubclassOf anziché IsAssignable;

+0

Buon punto. Grazie. – sh0gged

+0

Il tuo penultimo paragrafo è corretto? Ho pensato 'a.GetType(). IsAssignableFrom (typeof (b))' sarebbe vero se 'a = b;' era valido. – Sam

+0

@ Sam - Sì, hai ragione, grazie. – Lee

Problemi correlati