在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>的邏輯
}