Une méthode efficace en C# pour déterminer avec précision si un type est un sous-type d'un autre type
Lorsque vous traitez des types en C#, vous devez souvent déterminer la relation entre les types. Un besoin courant est de vérifier si un type est une sous-classe d’un autre type, ou plus précisément, un sous-type de cette classe.
IsSubclassOf : Vérité partielle
La méthodeType.IsSubclassOf
permet de vérifier directement si un type est une sous-classe d'un autre type :
<code class="language-csharp">typeof(SubClass).IsSubclassOf(typeof(BaseClass)); // 返回 true</code>
Cependant, cette approche échoue lorsque les deux types sont identiques :
<code class="language-csharp">typeof(BaseClass).IsSubclassOf(typeof(BaseClass)); // 返回 false</code>
IsAssignableFrom : Plus large mais pas parfait
L'approcheType.IsAssignableFrom
résout ce problème, mais elle a aussi ses propres inconvénients. Bien qu'il indique avec précision qu'une sous-classe ou le même type est un sous-type, il peut également renvoyer des faux positifs pour des types non liés :
<code class="language-csharp">typeof(BaseClass).IsAssignableFrom(typeof(DerivedClass)); // 返回 true typeof(BaseClass).IsAssignableFrom(typeof(BaseClass)); // 返回 true typeof(int[]).IsAssignableFrom(typeof(uint[])); // 返回 true</code>
est et comme : orienté objet mais avec des limites
Les mots-clésis
et as
peuvent également être utilisés pour la vérification de type, mais ils agissent sur les instances d'objet plutôt que sur les types eux-mêmes. Cela limite leur applicabilité dans l’analyse de code statique.
Conclusion : Combiner les méthodes pour améliorer la précision
Malheureusement, aucune méthode intégrée ne capture pleinement le concept de vérification de sous-type sans introduire de faux résultats positifs ou nécessiter des références d'objet. Le moyen le plus fiable est de combiner la méthode Type.IsSubclassOf
avec une vérification d'égalité explicite :
<code class="language-csharp">bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) { return potentialDescendant.IsSubclassOf(potentialBase) || potentialDescendant == potentialBase; }</code>
Cette méthode personnalisée fournit un moyen concis et précis de déterminer si un type est un sous-type d'un autre type, y compris le cas du même type.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!