如何检测通用摘要 class 的子 class?

How to detect a subclass of a generic abstract class?

我想创建一个基于通用抽象 class 的 class 层次结构。我需要能够在代码库中识别我的 subclasses。我尝试使用 Type.IsSubclassOf,但它没有按预期工作。

namespace TestIsSubclassOf
{
    public class Program
    {
        private static void Main()
        {
            var testClass = typeof(TestClass);
            var isSubclass = testClass.IsSubclassOf(typeof(TestBaseClass<>)); // expected - true, actual - false
        }
    }

    public abstract class TestBaseClass<T>
    {
    }

    public class TestClass : TestBaseClass<int>
    {
    }
}

识别TestBaseClass子class的正确方法是什么?

您需要检查您的 testClass 是否是 TestBaseClass<int> 的子 class 而不是 TestBaseClass<>,因为您可以继承自不同的泛型 'version' class.

所以使用下面的代码isSubclass returns true:

var testClass = typeof(TestClass);
var isSubclass = testClass.IsSubclassOf(typeof(TestBaseClass<int>));

如果您想检查 class 是否继承 TestBaseClass 而不管使用的泛型类型,您可以尝试以下操作:

var testClass = typeof(TestClass);
if (testClass.BaseType.IsGenericType &&
    testClass.BaseType.GetGenericTypeDefinition() == typeof(TestBaseClass<>))
{
    //testClass inherits from TestBaseClass<>
}