c#中判斷類是否繼承于泛型基類
在c#中,有時候我們會編寫類似這樣的代碼:
public class a<T>
{ //具體類的實現(xiàn)
}
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也就是正?,F(xiàn)象了。
那么如何解決這個問題呢?
最簡單的辦法肯定是typeof(b).baseType == typeof(a<string>)這樣就可以返回true。
但是由于我們用了T,所以大概率我們是不知道進來的類型的,所以這種方法不行。
另一種方法麻煩一點。
首先,我們把泛型類型轉(zhuǎn)換成泛型原型,然后再去比較泛型原型就可以了。
c#中提供了獲取泛型原型的方法GetGenericTypeDefinition(),MSDN解釋如下:
返回一個表示可用于構(gòu)造當(dāng)前泛型類型的泛型類型定義的 Type 對象。
所以我們直接使用typeof(b).baseType.GetGenericTypeDefinition()既可獲取a<>。
這里需要注意的是GetGenericTypeDefinition()在b不是泛型時會拋出異常,所以我們在使用前應(yīng)該判斷b是否是一個泛型類。
c#中同樣提供了這個方法IsGenericType,MSDN解釋如下:
獲取一個值,該值指示當(dāng)前類型是否是泛型類型。
所以我們判斷一個類是否繼承于泛型基類的方法就是這樣的:
if (typeof(b).baseType.IsGenericType && typeof(b).baseType.GetGenericTypeDefinition() == typeof(a)){
// 這里是b繼承于a<T>的邏輯
}到此這篇關(guān)于c#中判斷類是否繼承于泛型基類的文章就介紹到這了,更多相關(guān)c#判斷類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#(WinForm) ComboBox和ListBox添加項及設(shè)置默認(rèn)選擇項
這篇文章主要介紹了C#(WinForm) ComboBox和ListBox添加項及設(shè)置默認(rèn)選擇項的的相關(guān)資料,需要的朋友可以參考下2014-07-07
Linq利用Distinct去除重復(fù)項問題(可自己指定)
這篇文章主要介紹了Linq利用Distinct去除重復(fù)項問題(可自己指定),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

