2009-09-16 7 views

Répondre

21

Type.IsSubclassOf() Détermine si la classe représentée par le Type en cours dérive de la classe représentée par le Type spécifié.

+1

Hmm ... Ça devrait bien marcher aussi. Maintenant, je suis curieux de savoir quelle est la différence entre Type.IsAssgnableFrom et Type.IsSubclassOf? – sh0gged

+1

type1.IsAssignableFrom (type2) fonctionnera si type1 est une interface –

+0

Maintenant, je suppose que Type.IsSubclassOf() ressemble plus à ce que je cherchais. :) Je vous remercie. – sh0gged

14

Vous recherchez probablement Type.IsAssignableFrom.

+0

Yeap, ça marche pour moi. Merci! – sh0gged

+0

Ceci est utile, mais il retournera 'true' si les deux types sont identiques. Il existe certaines différences entre la compatibilité d'affectation et l'héritage. Je trouve aussi plus difficile à lire que "IsSubClassOf". – Sam

0

Je pense que vous êtes à la recherche de cette Type.IsSubclassOf()

Edit:

Je ne sais pas à vos besoins, mais peut-être des thats la meilleure façon:

bool isDescendant = cValue is C; 
+1

Je pense que dans le cas de System.Type qui ne fonctionne tout simplement pas. – sh0gged

5

Je sais que cela ne fonctionne pas répondez directement à votre question, mais vous pourriez envisager d'utiliser ceci à la place de la méthode dans votre exemple:

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

Ainsi, vous pouvez l'utiliser comme ceci:

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

Aussi, pour répondre à votre question sur la différence entre Type.IsSubclassOf et Type.IsAssignableFrom - IsAssignableFrom est plus faible dans le sens que si vous avez deux objets a et b de telle sorte que ceci est valable:

a = b; 

alors typeof(A).IsAssignableFrom(b.GetType()) est vrai - donc un pourrait être une sous-classe de b, ou un type d'interface.

Par contre, a.GetType().IsSubclassOf(typeof(B)) ne retournera vrai que si a était une sous-classe de b. Étant donné le nom de votre méthode d'extension, je dirais que vous devriez utiliser IsSubclassOf au lieu de IsAssignable;

+0

Bon point. Merci. – sh0gged

+0

L'avant-dernier paragraphe est-il correct? Je pensais que 'a.GetType(). IsAssignableFrom (typeof (b))' serait vrai si 'a = b;' était valide. – Sam

+0

@Sam - Oui, vous avez raison, merci. – Lee

Questions connexes