Il y a un petit problème avec cette idée, car chaque objet (et, en fait, chaque type) a une classe de base commune, Object. Ce que vous devez définir, c'est jusqu'où vous voulez aller dans la chaîne d'héritage (que ce soit la même chose ou le même parent immédiat, ou l'un est le parent immédiat de l'autre, etc.) et faites votre vérifie de cette façon. IsAssignableFrom
est utile pour déterminer si les types sont compatibles les uns avec les autres, mais n'établira pas complètement s'ils ont le même parent (si c'est ce que vous recherchez).
Si vos critères stricts est que la fonction doit retourner vrai si ...
- Les types sont identiques
- Un type est le parent (immédiat ou autre) de l'autre
- Les deux types ont le même parent immédiat
Vous pouvez utiliser
private bool AreSame(Type a, Type b)
{
if(a == b) return true; // Either both are null or they are the same type
if(a == null || b == null) return false;
if(a.IsSubclassOf(b) || b.IsSubclassOf(a)) return true; // One inherits from the other
return a.BaseType == b.BaseType; // They have the same immediate parent
}
+1 Je n'étais pas au courant de cette fonction pratique IsAssignableFrom, je vais devoir garder cela à l'esprit. – James
Il y a pas mal de choses utiles dans la hiérarchie de Reflection! Il est intéressant de simplement parcourir la liste des membres - les chances sont assez bonnes, vous trouverez ce dont vous avez besoin. Lisez les documents, cependant. Par exemple, IsAssignableFrom renverrait true si t était un param de type générique et que u était une contrainte. –
Juste pour info, cela ne retournera pas vrai si les deux classes ont la même classe de base. –