欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

.NET/C#怎么判斷某個類是否是泛型類型或泛型接口的子類型-創(chuàng)新互聯(lián)

這篇文章主要介紹.NET/C#怎么判斷某個類是否是泛型類型或泛型接口的子類型,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、美蘭網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、商城網(wǎng)站定制開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為美蘭等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

前言

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

C#泛型特點:

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

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

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

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

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

.NET 中沒有自帶的方法


對于實例,.NET 中提供了這些方法來判斷:

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

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

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

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

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

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

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

我們需要自己編寫方法


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

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

比如,我們要判斷接口:

public static bool HasImplementedRawGeneric(this Type type, Type generic)
{
 // 遍歷類型實現(xiàn)的所有接口,判斷是否存在某個接口是泛型,且是參數(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);
}

于是,我們可以把這兩個方法合成一個,用于實現(xiàn)類似 IsAssignableFrom 的效果,不過這回將支持原始接口(也就是typeof(Foo<>))。

/// <summary>
/// 判斷指定的類型 <paramref name="type"/> 是否是指定泛型類型的子類型,或?qū)崿F(xiàn)了指定泛型接口。
/// </summary>
/// <param name="type">需要測試的類型。</param>
/// <param name="generic">泛型接口類型,傳入 typeof(IXxx<>)</param>
/// <returns>如果是泛型接口的子類型,則返回 true,否則返回 false。</returns>
public static bool HasImplementedRawGeneric([NotNull] this Type type, [NotNull] Type generic)
{
 if (type == null) throw new ArgumentNullException(nameof(type));
 if (generic == null) throw new ArgumentNullException(nameof(generic));

 // 測試接口。
 var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType);
 if (isTheRawGenericType) return true;

 // 測試類型。
 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);
}

以上是“.NET/C#怎么判斷某個類是否是泛型類型或泛型接口的子類型”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:.NET/C#怎么判斷某個類是否是泛型類型或泛型接口的子類型-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://aaarwkj.com/article2/ccdpic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、小程序開發(fā)、建站公司Google、網(wǎng)站收錄品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
亚洲国产精品中文字幕一区久久| 夜色一区二区av人片| 草逼免费在线观看视频| 日韩欧美中文字幕区| 久久精品亚洲精品国产| 中文字幕91在线播放| 女同毛片一区二区三区| 日韩在线观看视频有码| 深夜日本福利在线观看| 中文字幕乱码av一区二区| 精品国产91高清在线观看| 夜夜高潮夜夜爽免费观看| 在线成人影院中文字幕| 精品妇女一区二区三区| 国产精品日韩经典中文字幕| 日韩亚洲国产欧美在线观看| 人妻日韩字幕一区二区| 黄片免费视频大全在线观看| 日本免费精品一区二区三区四区| 黑人爆操中国女孩在线观看| 日本三本道成人免费毛片| 2020中文字字幕在线不卡| 久久精品国产亚洲av麻豆尤物| 亚洲国产精品综合久久网络| 高清白嫩学生自拍视频| 亚洲一区制服无码中文| 日韩精品视频在线不卡播放 | 日本加勒比系列在线播放| 日韩欧美一区亚洲一区| av资源中文字幕在线天堂| 亚洲男人天堂在线视频| 亚洲成人精品久久久| 亚洲精品一区二区影院| 伊人99热这里只有精品| 亚洲精品一二三区免费| 亚洲精品啪啪一区二区| 亚洲av毛片免费在线观看| 久久精品亚洲精品毛片| 97视频高清在线观看| 欧美一区二区三区十区| 亚洲欧美日韩激情另类|