c#中判斷類是否繼承於泛型基類

jvx發表於2022-04-13

在c#中,有時候我們會編寫類似這樣的程式碼:

public class a<T> 
{ //具體類的實現
}
public class b : a<string>{}

如果b繼承a的型別不確定,這個時候我們是無法通過baseType來直接判斷b是否繼承於a的。

如果我們寫如下程式碼:

typeof(b).baseType == typeof(a)

返回值是false

因為typeof(b).baseType返回的型別是a`1[System.String],而typeof(a<>)返回的是a`1[T]。很明顯這兩個型別是不相等的。所以上面返回flase也就是正常現象了。


那麼如何解決這個問題呢?

最簡單的辦法肯定是typeof(b).baseType == typeof(a<string>)這樣就可以返回true。

但是由於我們用了T,所以大概率我們是不知道進來的型別的,所以這種方法不行。

另一種方法麻煩一點。

首先,我們把泛型型別轉換成泛型原型,然後再去比較泛型原型就可以了。

c#中提供了獲取泛型原型的方法GetGenericTypeDefinition(),MSDN解釋如下:

返回一個表示可用於構造當前泛型型別的泛型型別定義的 Type 物件。

所以我們直接使用typeof(b).baseType.GetGenericTypeDefinition()既可獲取a<>

這裡需要注意的是GetGenericTypeDefinition()在b不是泛型時會丟擲異常,所以我們在使用前應該判斷b是否是一個泛型類。

c#中同樣提供了這個方法IsGenericType,MSDN解釋如下:

獲取一個值,該值指示當前型別是否是泛型型別。

所以我們判斷一個類是否繼承於泛型基類的方法就是這樣的:

if (typeof(b).baseType.IsGenericType && typeof(b).baseType.GetGenericTypeDefinition() == typeof(a)){ 
// 這裡是b繼承於a<T>的邏輯
}

相關文章