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;
}
IsInstanceOfType
s'intégrerait-il?la source
Vous devriez plutôt essayer d'utiliser Type.IsAssignableFrom .
la source
Si vous essayez de le faire dans un projet PCL Xamarin Forms, les solutions ci-dessus utilisant
IsAssignableFrom
donnent une erreur:car
IsAssignableFrom
demande unTypeInfo
objet. Vous pouvez utiliser laGetTypeInfo()
méthode à partir deSystem.Reflection
:typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
la source
Je poste cette réponse avec l'espoir que quelqu'un partage avec moi si et pourquoi ce serait une mauvaise idée. Dans mon application, j'ai une propriété de Type que je veux vérifier pour être sûr que c'est typeof (A) ou typeof (B), où B est n'importe quelle classe dérivée de A. Donc mon code:
Je sens que je pourrais être un peu naïf ici, donc tout commentaire serait le bienvenu.
la source