Comment déterminez-vous si un Type donné (System.Type) hérite d'une classe de base spécifique (en .Net)?
-
02-07-2019 - |
Question
Cela va probablement être une réponse facile et il me manque quelque chose, mais voilà ... Si j'ai un Type (c'est-à-dire un System.Type réel ... pas une instance), comment faire Je dis si elle hérite d'un autre type de base spécifique?
La solution
Utilisez la méthode IsSubclassOf du classe System.Type .
Autres conseils
Une chose à clarifier entre Type.IsSubTypeOf ()
et Type.IsAssignableFrom ()
:
-
IsSubType ()
renverratrue
uniquement si le type donné est dérivé de le type spécifié. Il renverrafalse
si le type donné IS le type spécifié. -
IsAssignableFrom ()
renverratrue
si le type donné est le type type spécifié ou dérivé du type spécifié.
Donc, si vous utilisez ces éléments pour comparer BaseClass
et DerivedClass
(qui hérite de BaseClass
), alors:
BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE
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 une classe ou une 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:
true si [l'argument] et le Type en cours représentent le même type, ou si le Type en cours se trouve 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 if [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).