我有以下通用类:

class Base<T> where T : ... { ... }
class Derived<T> : Base<T> where T : ... { ... }
class Another<T> where T : ... { ... }
class DerivedFromDerived<T> : Derived<T> where T : ... { ... }

我想在代码的某处测试给定的泛型是否继承自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);
}

编辑:谢谢,马克。现在我看到了光。我最初尝试了以下方法:
typeof(Derived<>).BaseType == typeof(Base<>)

显然,这是正确的。 但事实并非如此。 问题在于Base的T与Derived的T不同。因此,在
typeof(Base<>)
BaseT是自由类型。但在
typeof(Derived<>).BaseType
BaseT绑定(bind)到DerivedT,后者又是自由类型。 (这太棒了,我会喜欢来查看System.Reflection的源代码!)现在,
typeof(Derived<>).BaseType.GetGenericTypeDefinition()

绑定(bind)BaseT。结论:
typeof(Derived<>).BaseType.GetGenericTypeDefinition() == typeof(Base<>)

现在,如果大家都对不起,我的头在燃烧。

最佳答案

不确定这是否是您要寻找的东西,但我认为“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);
    }
}

要处理开放式基本类型,请执行以下操作:
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;
    }

10-07 19:01
查看更多