5

我有一个通用的抽象类,我从中派生出:

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

4 回答 4

1

IsSubclassOf函数与泛型类型结合使用:

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

@object您要检查的类型在哪里(我从您的问题中复制了命名,但 object 不是一个好名字,因为它是所有类的超类)。

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

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

编辑:您的最后一条评论 - 从泛型类型派生的非泛型类型:

if (@object.GetType().IsSubclassOf(typeof(Superclass<>)))
于 2013-08-07T08:48:16.253 回答
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;
}

请注意,如果您正在寻找接口,这将不起作用!

于 2013-08-07T09:06:26.087 回答
1

显然,所有明显的解决方案(IsSubclassOf, IsAssignableFrom, is, as)在这种情况下都不起作用。所以我试图强迫一些事情,并想出了这种测试类是否为的方法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...
于 2013-08-07T09:16:15.120 回答
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));

我希望这有帮助。

于 2013-08-07T08:51:06.283 回答