检测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中文网其他相关文章!