偵測C#中型別是否繼承自泛型基底類別
在程式設計中,確定類別之間的關係(特別是涉及繼承時)通常是必要的。然而,當處理具有類型參數的泛型類別時,透過標準方法驗證繼承可能會很困難。
問題:
假設您有以下泛型類別和衍生類別:
<code class="language-csharp">public class GenericClass<T> : GenericInterface<T> { } public class Test : GenericClass<SomeType> { }</code>
您想要檢查給定的Type物件(例如,typeof(Test)
)是否表示繼承自GenericClass
的類型。但是,使用typeof(Test).IsSubclassOf(typeof(GenericClass))
會失敗,因為它沒有考慮泛型類型參數。
解:
為了解決這個問題,您可以使用以下程式碼來確定型別是否衍生自泛型基底類別:
<code class="language-csharp">static bool IsSubclassOfRawGeneric(Type generic, Type toCheck) { while (toCheck != null && toCheck != typeof(object)) { var cur = toCheck.IsGenericType ? toCheck.GetGenericTypeDefinition() : toCheck; if (generic == cur) { return true; } toCheck = toCheck.BaseType; } return false; }</code>
此方法透過遍歷繼承鏈並比較基底類型來決定toCheck
是否直接或間接繼承自generic
。它透過檢查IsGenericType
屬性的存在並檢索泛型類型的定義來處理非泛型類型和泛型類型。
透過這種方法,您可以準確地確定類型是否派生自泛型基類,而不管指定的類型參數是什麼。
使用範例:
<code class="language-csharp">bool result = IsSubclassOfRawGeneric(typeof(GenericClass<>), typeof(Test)); // result will be true</code>
以上是如何確定 C# 中的類型是否繼承自通用基底類別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!