国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET/C#如何判斷某個(gè)類是否是泛型類型或泛型接口的子類型詳解

2024-07-10 12:48:44
字體:
供稿:網(wǎng)友

前言

泛型:通過參數(shù)化類型來實(shí)現(xiàn)在同一份代碼上操作多種數(shù)據(jù)類型。利用“參數(shù)化類型”將類型抽象化,從而實(shí)現(xiàn)靈活的復(fù)用。在.NET類庫中處處都可以看到泛型的身影,尤其是數(shù)組和集合中,泛型的存在也大大提高了程序員的開發(fā)效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通過避免裝箱和拆箱操作來達(dá)到性能提升的目的。因此,我們很有必要掌握并善用這個(gè)強(qiáng)大的語言特性。

C#泛型特點(diǎn):

1、如果實(shí)例化泛型類型的參數(shù)相同,那么JIT編輯器會(huì)重復(fù)使用該類型,因此C#的動(dòng)態(tài)泛型能力避免了C++靜態(tài)模板可能導(dǎo)致的代碼膨脹的問題。

2、C#泛型類型攜帶有豐富的元數(shù)據(jù),因此C#的泛型類型可以應(yīng)用于強(qiáng)大的反射技術(shù)。

3、C#的泛型采用“基類、接口、構(gòu)造器,值類型/引用類型”的約束方式來實(shí)現(xiàn)對(duì)類型參數(shù)的“顯示約束”,提高了類型安全的同時(shí),也喪失了C++模板基于“簽名”的隱式約束所具有的高靈活性

.NET 中提供了很多判斷某個(gè)類型或?qū)嵗悄硞€(gè)類的子類或某個(gè)接口的實(shí)現(xiàn)類的方法,然而這事情一旦牽扯到泛型就沒那么省心了。

本文將提供判斷泛型接口實(shí)現(xiàn)或泛型類型子類的方法。

.NET 中沒有自帶的方法

對(duì)于實(shí)例,.NET 中提供了這些方法來判斷:

if (instance is Foo || instance is IFoo){}

對(duì)于類型,.NET 中提供了這些方法來判斷:

if (typeof(Foo).IsAssignableFrom(type) || typeof(IFoo).IsAssignableFrom(type)){}

或者,如果不用判斷接口,只判斷類型的話:

if (type.IsSubClassOf(typeof(Foo))){}

對(duì)于 typeof 關(guān)鍵字,不止可以寫 typeof(Foo) ,還可以寫 typeof(Foo<>)  。這可以得到泛型版本的 Foo<T> 的類型。

不過,如果你試圖拿這個(gè)泛型版本的 typeof(Foo<>) 執(zhí)行上述所有判斷,你會(huì)發(fā)現(xiàn)所有的 if 條件都會(huì)是 false 。

我們需要自己編寫方法

typeof(Foo<>)typeof(Foo<SomeClass>) 之間的關(guān)系就是 GetGenericTypeDefinition 函數(shù)帶來的關(guān)系。

所以我們可以充分利用這一點(diǎn)完成泛型類型的判斷。

比如,我們要判斷接口:

public static bool HasImplementedRawGeneric(this Type type, Type generic){ // 遍歷類型實(shí)現(xiàn)的所有接口,判斷是否存在某個(gè)接口是泛型,且是參數(shù)中指定的原始泛型的實(shí)例。 return type.GetInterfaces().Any(x => generic == (x.IsGenericType ? x.GetGenericTypeDefinition() : x));}

而如果需要判斷類型,那么就需要遍歷此類的基類了:

public static bool IsSubClassOfRawGeneric([NotNull] this Type type, [NotNull] Type generic){ if (type == null) throw new ArgumentNullException(nameof(type)); if (generic == null) throw new ArgumentNullException(nameof(generic)); while (type != null && type != typeof(object)) { isTheRawGenericType = IsTheRawGenericType(type); if (isTheRawGenericType) return true; type = type.BaseType; } return false; bool IsTheRawGenericType(Type test) => generic == (test.IsGenericType ? test.GetGenericTypeDefinition() : test);}            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 牡丹江市| 邵东县| 夏河县| 永济市| 芜湖市| 左贡县| 龙里县| 八宿县| 页游| 滦南县| 凤山县| 隆昌县| 美姑县| 乌审旗| 潮州市| 平江县| 连平县| 湖口县| 潍坊市| 大同县| 改则县| 恩平市| 平陆县| 乐昌市| 卢龙县| 汉源县| 开阳县| 开阳县| 沿河| 开平市| 西充县| 台湾省| 循化| 湖南省| 景宁| 惠安县| 康保县| 河北区| 丹巴县| 阳江市| 任丘市|