我需要在不知道泛型类型参数的情况下测试一个值是否是泛型基类的实例。使用 MSDN example作为示例的基础,这是我想要完成的:
using System;
public class Class1<T> { }
public class DerivedC1 : Class1<int> { }
class IsSubclassTest
{
public static void Main()
{
Console.WriteLine(
"DerivedC1 subclass of Class1: {0}",
typeof(DerivedC1).IsSubclassOf(typeof(Class1<>)) // <- Here.
);
}
}
虽然这在语法上是正确的,但它总是会产生错误。如果我删除通用类型参数,它会按预期工作(返回 true)。
如何在不知道其泛型类型参数的情况下测试类类型是否是泛型基类的子类?
最佳答案
问题是 DrevidedC1
不是 Class1<T>
的子类, 它是 Class1<int>
的子类.确保您了解这种细微差别; Class1<T>
是一个开放类型(T
可以是任何东西,它还没有被设置)而DerivedC1
扩展封闭类型 Class1<int>
(它不再在 T
中打开,T
设置为 int
且仅 int
)。因此,当您执行以下操作时:
typeof(DerivedC1).IsSubclassOf(typeof(Class1<>))
答案显然是false
.
您需要做的是检查 DerivedC1
的通用类型定义的基类型(将其视为 Class1<int>
的相应开放泛型类型)等于 Class1<T>
它显然是这样做的。
因此正确的代码是:
typeof(DerivedC1).BaseType.GetGenericTypeDefinition() == typeof(Class1<>));
或者更好,正如 Matías Fidemraizer 在他的 answer 中所说的那样:
typeof(DerivedC1).BaseType.GetGenericTypeDefinition().IsAssignableFrom(typeof(Class1<>)));
关于c# - 判断对象是否是泛型基类的实例,任意泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184154/