型が別の型のサブタイプであるかどうかを正確に判断する C# の効果的な方法
C# で型を扱う場合、多くの場合、型間の関係を判断する必要があります。一般的なニーズは、ある型が別の型のサブクラスであるかどうか、より正確にはそのクラスのサブタイプであるかどうかを確認することです。
IsSubclassOf: 部分的な真実
Type.IsSubclassOf
メソッドは、型が別の型のサブクラスであるかどうかを直接チェックする方法を提供します。
<code class="language-csharp">typeof(SubClass).IsSubclassOf(typeof(BaseClass)); // 返回 true</code>
<code class="language-csharp">typeof(BaseClass).IsSubclassOf(typeof(BaseClass)); // 返回 false</code>
IsAssignableFrom: 範囲は広いですが完璧ではありません
アプローチはこの問題を解決しますが、独自の欠点もあります。これは、サブクラスまたは同じ型がサブタイプであることを正確に示しますが、無関係な型に対して誤検知を返す場合もあります: Type.IsAssignableFrom
<code class="language-csharp">typeof(BaseClass).IsAssignableFrom(typeof(DerivedClass)); // 返回 true typeof(BaseClass).IsAssignableFrom(typeof(BaseClass)); // 返回 true typeof(int[]).IsAssignableFrom(typeof(uint[])); // 返回 true</code>
はオブジェクト指向ですが、制限があります
および is
キーワードは型チェックにも使用できますが、型自体ではなくオブジェクト インスタンスに作用します。これにより、静的コード分析での適用性が制限されます。 as
結論: 方法を組み合わせて精度を向上させる
残念ながら、誤検知の結果をもたらしたり、オブジェクト参照を要求したりすることなく、サブタイプ チェックの概念を完全に捉えている組み込みメソッドは 1 つもありません。最も信頼性の高い方法は、 メソッドと明示的な等価性チェックを組み合わせることです。 Type.IsSubclassOf
<code class="language-csharp">bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant) { return potentialDescendant.IsSubclassOf(potentialBase) || potentialDescendant == potentialBase; }</code>
以上がC# で、ある型が別の型のサブタイプであるかどうかを正確に判断するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。