2008-09-24 4 views
23

Cela va probablement être une réponse facile et je manque juste quelque chose, mais ici va ... Si j'ai un type, (c'est un System.Type réel ... pas une instance) comment puis-je dire si elle hérite d'un autre type de base spécifique?Comment déterminez-vous si un type donné (System.Type) hérite d'une classe de base spécifique (dans .Net)?

+2

Notez que la [Type.IsSubclassOf] (http://msdn.microsoft.com /en-us/library/system.type.issubclassof.aspx) La méthode ne fonctionne pas pour les types génériques! [** Jetez un oeil à cet article **] (http://www.pvladov.com/2012/05/get-all-derived-types-of-class.html) pour une implémentation de la méthode IsSubclassOf qui fonctionne pour les génériques aussi bien. –

Répondre

31

Utilisez la méthode IsSubclassOf de la classe System.Type.

+0

Cela fonctionnera-t-il également entre les interfaces? –

+0

Pour les interfaces, il existe la méthode GetInterface – chakrit

+0

Donc ... cela ne répond pas complètement à la question. Cela ne fonctionnerait pas si vous tapez une interface d'implémentation b –

22

EDIT: Notez que la solution ci-dessus échouera si le type de base que vous recherchez est une interface. La solution suivante fonctionnera pour tout type d'héritage, que ce soit la classe ou l'interface.

// Returns true if "type" inherits from "baseType" 
public static bool Inherits(Type type, Type baseType) { 
    return baseType.IsAssignableFrom(type) 
} 

(semi) extrait utile du MSDN article:

vrai si [l'argument] et le type de courant représentent le même type, ou si le type de courant est dans la hiérarchie d'héritage de [l'argument ], ou si le Type en cours est une interface que [l'argument] implémente, ou si [l'argument] est un paramètre de type générique et le Type en cours représente l'une des contraintes de [l'argument]. false si aucune de ces conditions n'est vraie ou si [l'argument] est une référence null (Nothing en Visual Basic).

+0

Oui, contrairement à Type.IsSubclassOf, cela fonctionne également sur les interfaces. –

22

Une chose à clarifier entre Type.IsSubTypeOf() et Type.IsAssignableFrom():

  • IsSubType() retournera true que si le type donné est dérivé de du type spécifié. Il renverra false si le type donné IS le type spécifié.

  • IsAssignableFrom() retournera true si le type donné est soit du type spécifié ou dérivé du type spécifié.

Donc, si vous utilisez ces BaseClass pour comparer et DerivedClass (qui hérite de BaseClass) puis:

BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE 
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE 

DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE 
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE 
+0

Bien écrit. A m'a aidé :-) merci. –

+8

En fait, DerivedClassInstance.GetType.IsAssignableFrom (GetType (BaseClass)) retournera FALSE. Vous devez l'appliquer dans l'autre sens: typeof (BaseClass) .IsAssignableFrom (typeof (DerivedClass)).En d'autres termes, vous ne pouvez pas faire ce qui suit: DerivedClass c = new BaseClass(); Quel est ce que IsAssignableFrom teste – jspaey

+0

Si vous avez juste le type dans votre main. Comme 'propertyInfo.PropertyType' comment pouvez-vous déterminer si une interface implémentée à partir de ce type? IsAssignableFrom donne juste une compatibilité entre eux. Pour exciter un exemple plus clair, je n'ai pas pu trouver si un type est vraiment et exactement IList sur une liste de types. Ce pourrait être une autre chose conduite par IList. Cela devrait être un problème polymorphe. –

Questions connexes