.NET のジェネリック クラスからの継承の識別
.NET の継承メカニズムにより、クラスは基本クラスの機能を拡張できます。 ジェネリック クラスは、継承を決定するとき、特に Type
オブジェクトを扱うときに複雑さが加わります。 基本クラスがジェネリックである場合、標準の IsSubclassOf
メソッドでは十分ではありません。
課題:
次の例を考えてみましょう:
<code class="language-csharp">public class GenericClass<T> : IGenericInterface<T> { } public class TestClass : GenericClass<string> { }</code>
typeof(TestClass).IsSubclassOf(typeof(GenericClass<string>))
は閉じたジェネリック型であり、ジェネリック型定義ではないため、typeof(GenericClass<string>)
を単にチェックするだけでは機能しません。
解決策:
次のヘルパー関数は、型が raw ジェネリック型定義から継承しているかどうかを効果的に決定します。
<code class="language-csharp">static bool IsSubclassOfRawGeneric(Type genericType, Type toCheck) { while (toCheck != null && toCheck != typeof(object)) { Type currentType = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; if (genericType == currentType) { return true; } toCheck = toCheck.BaseType; } return false; }</code>
この関数は、toCheck
に到達するまで、object
の基本型を反復処理します。型ごとに、それがジェネリック型であるかどうかがチェックされます。そうである場合、GetGenericTypeDefinition()
を使用してジェネリック型定義を取得します。 次に、関数はこの生のジェネリック型定義と提供された genericType
を比較します。 一致により、生のジェネリック型からの継承が確認されます。
このアプローチは、ジェネリック クラスからの継承を正確に識別し、このシナリオにおける標準の IsSubclassOf
メソッドの制限を克服します。 この関数を使用すると、Type
オブジェクトが特定のジェネリック クラスから派生したクラスを表すかどうかを確実に判断できます。
以上がクラスが .NET のジェネリック クラスから継承しているかどうかを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。