Sea*_* C. 5 c# generics reflection inheritance
public class BaseGenericType<T>
{
}
public class SubGenericType<T>: BaseGenericType<List<T>>
{
}
Run Code Online (Sandbox Code Playgroud)
我上面有两个泛型类型,一个继承自另一个但仍然是通用的.我无法弄清楚的奇怪的事情是typeof(SubGenericType<>).IsSubclassOf(typeof(BaseGenericType<>))返回false.并且typeof(SubGenericType<>).IsSubclassOf(typeof(BaseGenericType<List<>>))仍然返回false.我试着GetGenericTypeDefinition()和MakeGenericType()和GetGenericArguments()检查继承,仍然没有工作.但是typeof(SubGenericType<int>).IsSubclassOf(typeof(BaseGenericType<List<int>>))返回真实.
我想要的是通过反射获取所有类,然后获取继承自传入的泛型类型的特定类.
例如
(1)
List<int>- >(2)获取泛型类型定义==>
List<T>- >(3)make generic ==>
BaseGenericType<List<T>>- >(4)查找子类==>
SubGenericType<T>(5)make generic ==>
SubGenericType<int>
在步骤(4)中,我找不到任何东西,尽管我确实有这个SubGenericType<T>.这是为什么?
一旦我编写了这个方法来检查泛型类型继承:
static bool IsSubclassOfOpenGeneric(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;
}
Run Code Online (Sandbox Code Playgroud)
这返回真:
IsSubclassOfOpenGeneric(typeof(BaseGenericType<>), typeof(SubGenericType<int>))
Run Code Online (Sandbox Code Playgroud)
但它不检查接口。
顺便说一句,通常如果您有这样的关系,并且您自己编写所有类,请考虑使用接口。处理起来要容易得多。例如,您可以拥有一个没有通用参数的IGenericType接口。有时您只是不关心泛型类型,而只想访问不依赖于泛型类型的成员。有时您只想检查它是否是其中之一。您可以使用类型差异。