如何确定对象是否继承自抽象泛型类

时间:2013-08-07 08:44:58

标签: c# generics inheritance types

我有一个通用的抽象类,我来自:

abstract class SuperClass<T>
where T : SuperDataClass

abstract class SuperDataClass

数据类型仅限于SuperDataClass,因此每个具体数据类型都必须从SuperDataClass继承。 最后,我有一对SuperClass和SuperDataClass继承者,例如:

class DataClassA : SuperDataClass
class ClassA : SuperClass<DataClassA>

class DataClassB : SuperDataClass
class ClassB : SuperClass<DataClassB>

如何检查某个对象,例如ClassA是否从SuperClass继承而不知道可能的数据类型?

我尝试了以下操作,但不起作用:

if (testObject.GetType().IsAssignableFrom(typeof(SuperClass<SuperDataClass>))) {
    Console.WriteLine("The test object inherits from SuperClass");
}

那么if语句需要怎么样?

4 个答案:

答案 0 :(得分:1)

IsSubclassOf功能与通用类型结合使用:

if (@object.GetType().IsGenericType &&
    @object.GetType().GetGenericTypeDefinition().IsSubclassOf(typeof(SuperClass<>))) {
    Console.WriteLine("The object inherits from SuperClass");
}

@object是你要检查的类型(我复制了你问题的命名,但是对象不是好名字,因为它是所有类的超类)。

如果您想检查泛型类型参数,请使用

if (@object.GetType().IsGenericType &&  
    @object.GetType().GenericTypeArguments[0].IsSubclassOf(typeof(SuperDataClass)) && 
    @object.GetType().IsSubclassOf(typeof(Superclass<>)))

编辑:您的上一条评论 - 源自泛型类型的非泛型类型:

if (@object.GetType().IsSubclassOf(typeof(Superclass<>)))

答案 1 :(得分:1)

递归

Type type2 = type; // type is your type, like typeof(ClassA)

while (type2 != null)
{
    if (type2.IsGenericType && 
        type2.GetGenericTypeDefinition() == typeof(SuperClass<>))
    {
        // found
    }

    type2 = type2.BaseType;
}

请注意,如果您正在寻找界面,这将无效!

答案 2 :(得分:1)

显然,所有明显的解决方案(IsSubclassOfIsAssignableFromisas)在这种情况下都不起作用。所以我试着强迫一下,如果一个班级是SuperClass<Something>,我就会采用这种测试方式:

private bool IsSuperClassOfSomeKindOfSuperDataClass(Type type)
{
    if (!type.IsGenericType)
        return false;

    var gtd = type.GetGenericTypeDefinition();

    if (gtd != typeof(SuperClass<>))
        return false;

    var genericParameter = type.GetGenericArguments().First();

    return genericParameter.IsSubclassOf(typeof(SuperDataClass));
}

当然,这会测试一个 SuperClass<Something>类,而不是继承自 SuperClass<Something>,所以下一个明显的步骤是编写一个测试合适类的所有继承层次结构的函数:

private bool InheritsFromSuperClassOfSomeKindOfSuperDataClass(Type type)
{
    while (type != typeof(Object))
    {
        if (IsSuperClassOfSomeKindOfSuperDataClass(type))
            return true;

        type = type.BaseType;
    }

    return false;
}

有了这些功能,您正在寻找的测试是:

if (InheritsFromSuperClassOfSomeKindOfSuperDataClass(@object.GetType())) 
    // do stuff...

答案 3 :(得分:0)

在这里你应该知道预期的类型是什么。所以在这种情况下我会使用Type.IsSubclassOf Method

它的一个例子是

Class1 myClass = new Class1();
DerivedC1 myDClass = new DerivedC1();
Type myClassType = myClass.GetType();
Type myDClassType = myDClass.GetType();

// Returns true.
bool isSubClass = myDClassType.IsSubclassOf(myClassType));

我希望这会有所帮助。