如何测试两个泛型是否具有基本子类关系而不实例化它们?

pyo*_*yon 5 c# generics reflection

我有以下通用类:

class Base<T> where T : ... { ... }
class Derived<T> : Base<T> where T : ... { ... }
class Another<T> where T : ... { ... }
class DerivedFromDerived<T> : Derived<T> where T : ... { ... }
Run Code Online (Sandbox Code Playgroud)

在我的代码中的某处,我想测试给定的泛型是否继承Base<T>,而不创建泛型的特定实例.我怎么做?

static bool DerivedFromBase(Type type) { /* ??? */ }

static void Main(string[] args)
{
    Console.WriteLine(DerivedFromBase(typeof(Derived<>)));            // true
    Console.WriteLine(DerivedFromBase(typeof(Another<>)));            // false
    Console.WriteLine(DerivedFromBase(typeof(DerivedFromDerived<>))); // true
    Console.ReadKey(true);
}
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢马克.现在我看到了光明.我最初尝试过以下内容:

typeof(Derived<>).BaseType == typeof(Base<>)
Run Code Online (Sandbox Code Playgroud)

显然,这是正确的.但事实并非如此.问题是,BaseT与T的不同Derived.所以,在

typeof(Base<>)
Run Code Online (Sandbox Code Playgroud)

BaseT是一个免费的类型.但在

typeof(Derived<>).BaseType
Run Code Online (Sandbox Code Playgroud)

BaseT是必然DerivedT,而这又是一种自由类型.(这是如此真棒我看到System.Reflection的源代码!)现在,

typeof(Derived<>).BaseType.GetGenericTypeDefinition()
Run Code Online (Sandbox Code Playgroud)

unbounds BaseT.结论:

typeof(Derived<>).BaseType.GetGenericTypeDefinition() == typeof(Base<>)
Run Code Online (Sandbox Code Playgroud)

而现在,如果你们都原谅我,我的头脑在燃烧.

Mar*_*lug 6

不确定这是否是您正在寻找的,但我认为"IsAssignableFrom"将成功.

class Program
{
    class Base<T> { }
    class Derived<T> : Base<T> { }
    class Another<T> { }
    class DerivedFromDerived<T> : Derived<T> { }

    static bool DerivedFromBase<T>(Type type)
    {
        return typeof(Base<T>).IsAssignableFrom(type);
    }

    static void Main(string[] args)
    {
        Console.WriteLine(DerivedFromBase<int>(typeof(Derived<int>)));            // true    
        Console.WriteLine(DerivedFromBase<int>(typeof(Another<int>)));            // false    
        Console.WriteLine(DerivedFromBase<int>(typeof(DerivedFromDerived<int>))); // true   
        Console.ReadKey(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

要处理开放基类型:

static bool DerivedFromBase(Type type)
    {
        Type openBase = typeof(Base<>);

        var baseType = type;

        while (baseType != typeof(Object) && baseType != null)
        {
            if (baseType.GetGenericTypeDefinition() == openBase) return true;

            baseType = baseType.BaseType;
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)