通用类型继承

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>.这是为什么?

Ste*_*ger 2

一旦我编写了这个方法来检查泛型类型继承:

    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接口。有时您只是不关心泛型类型,而只想访问不依赖于泛型类型的成员。有时您只想检查它是否其中之一。可以使用类型差异。