簡體   English   中英

如何確定對象是否繼承自抽象泛型類

[英]How to determine if an object inherits from an abstract generic class

我有一個通用的抽象類,我派生自:

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語句需要怎么樣?

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<>)))

遞歸

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

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

    type2 = type2.BaseType;
}

請注意,如果您正在尋找接口,這將不起作用!

顯然,所有的解決方案明顯( 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...

在這里你應該知道預期的類型是什么。 所以在這種情況下我會使用Type.IsSubclassOf方法

它的一個例子是

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

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

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM