Apparemment non.
Voici les options:
Type.IsSubclassOf
Comme vous l'avez déjà découvert, cela ne fonctionnera pas si les deux types sont identiques, voici un exemple de programme LINQPad qui montre:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Production:
True
False
Ce qui indique qu'il Derived
s'agit d'une sous-classe de Base
, mais ce Base
n'est (évidemment) pas une sous-classe en soi.
Type.IsAssignableFrom
Maintenant, cela répondra à votre question particulière, mais cela vous donnera également de faux positifs. Comme Eric Lippert l'a souligné dans les commentaires, bien que la méthode revienne effectivement True
pour les deux questions ci-dessus, elle reviendra également True
pour celles-ci, ce que vous ne voulez probablement pas:
void Main()
{
typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}
public class Base { }
public class Derived : Base { }
Ici, vous obtenez la sortie suivante:
True
True
True
La dernière True
là-bas indiquerait, si la méthode ne répondait qu'à la question posée, qu'elle uint[]
hérite int[]
ou qu'elle est du même type, ce qui n'est clairement pas le cas.
Ce IsAssignableFrom
n'est donc pas tout à fait correct non plus.
is
et as
Le "problème" avec is
et as
dans le contexte de votre question est qu'ils vous obligeront à opérer sur les objets et à écrire l'un des types directement dans le code, et non à travailler avec des Type
objets.
En d'autres termes, cela ne compilera pas:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
ni cela:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
ni cela:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Conclusion
Bien que les méthodes ci-dessus puissent répondre à vos besoins, la seule réponse correcte à votre question (telle que je la vois) est que vous aurez besoin d'une vérification supplémentaire:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
ce qui a bien sûr plus de sens dans une méthode:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}