最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年09月05日 11:50:50   作者:呂毅  
這篇文章主要給大家介紹了關(guān)于.NET/C#如何判斷某個(gè)類(lèi)是否是泛型類(lèi)型或泛型接口的子類(lèi)型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧

前言

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

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

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

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

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

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

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

.NET 中沒(méi)有自帶的方法

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

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

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

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

或者,如果不用判斷接口,只判斷類(lèi)型的話:

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

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

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

我們需要自己編寫(xiě)方法

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

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

比如,我們要判斷接口:

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

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

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);
}

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

/// <summary>
/// 判斷指定的類(lèi)型 <paramref name="type"/> 是否是指定泛型類(lèi)型的子類(lèi)型,或?qū)崿F(xiàn)了指定泛型接口。
/// </summary>
/// <param name="type">需要測(cè)試的類(lèi)型。</param>
/// <param name="generic">泛型接口類(lèi)型,傳入 typeof(IXxx<>)</param>
/// <returns>如果是泛型接口的子類(lèi)型,則返回 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));

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

 // 測(cè)試類(lèi)型。
 while (type != null && type != typeof(object))
 {
 isTheRawGenericType = IsTheRawGenericType(type);
 if (isTheRawGenericType) return true;
 type = type.BaseType;
 }

 // 沒(méi)有找到任何匹配的接口或類(lèi)型。
 return false;

 // 測(cè)試某個(gè)類(lèi)型是否是指定的原始接口。
 bool IsTheRawGenericType(Type test)
 => generic == (test.IsGenericType ? test.GetGenericTypeDefinition() : test);
}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • .net Core 3.0 WebApi 創(chuàng)建Linux守護(hù)進(jìn)程的方法

    .net Core 3.0 WebApi 創(chuàng)建Linux守護(hù)進(jìn)程的方法

    這篇文章主要介紹了.net Core 3.0 WebApi 創(chuàng)建Linux守護(hù)進(jìn)程的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • asp.net下將圖片保存到XML文件的方法

    asp.net下將圖片保存到XML文件的方法

    asp.net 將圖片保存到XML文件的方法,其實(shí)在實(shí)際應(yīng)用中,不建議這么做。
    2009-12-12
  • .NET使用結(jié)構(gòu)體替代類(lèi)提升性能優(yōu)化的技巧

    .NET使用結(jié)構(gòu)體替代類(lèi)提升性能優(yōu)化的技巧

    這篇文章主要介紹了.NET使用結(jié)構(gòu)體替代類(lèi)提升性能優(yōu)化的技巧,使用結(jié)構(gòu)體替代類(lèi)有什么好處呢?在什么樣的場(chǎng)景需要使用結(jié)構(gòu)體來(lái)替代類(lèi)呢?今天的文章為大家一一解答,需要的朋友可以參考下
    2022-05-05
  • asp.net datalist 用法

    asp.net datalist 用法

    asp.net datalist 用法,需要的朋友可以參考下。
    2009-08-08
  • Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼

    Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼

    這篇文章主要介紹了Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • .net等比縮放生成縮略圖的方法

    .net等比縮放生成縮略圖的方法

    本文給大家匯總了2個(gè)C#中等比縮放實(shí)現(xiàn)生成縮略圖的方法,第一種稍微簡(jiǎn)單些,第二種是本人常用的方法,這里推薦給大家,有需要的小伙伴可以參考下。
    2015-11-11
  • asp.net微信開(kāi)發(fā)(永久素材管理)

    asp.net微信開(kāi)發(fā)(永久素材管理)

    這篇文章主要介紹了asp.net微信開(kāi)發(fā)中有關(guān)永久素材管理的相關(guān)內(nèi)容,需要的朋友可以參考下
    2015-11-11
  • asp.net上傳文件到數(shù)據(jù)庫(kù)的解決方案

    asp.net上傳文件到數(shù)據(jù)庫(kù)的解決方案

    這篇文章主要介紹了ASP.NET上傳文件到數(shù)據(jù)庫(kù),先從文字上了解一下上傳文件到數(shù)據(jù)庫(kù)的具體步驟,再?gòu)拇a上來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2015-09-09
  • asp.net SQL存儲(chǔ)過(guò)程分頁(yè)

    asp.net SQL存儲(chǔ)過(guò)程分頁(yè)

    上周花一下午時(shí)間寫(xiě)了個(gè)分頁(yè).給大家分享下,如果寫(xiě)得不好請(qǐng)大家指出一起討論哈,小弟第一次寫(xiě)文章哈..謝謝.
    2009-05-05
  • 簡(jiǎn)單Web service 身份驗(yàn)證解決方案

    簡(jiǎn)單Web service 身份驗(yàn)證解決方案

    問(wèn)題提出:為了構(gòu)建一個(gè)安全的web服務(wù),需要對(duì)調(diào)用方進(jìn)行身份驗(yàn)證,只讓通過(guò)審核的用戶調(diào)用web服務(wù)。
    2009-05-05

最新評(píng)論

长汀县| 根河市| 绵竹市| 和平县| 邵阳县| 江口县| 沅陵县| 浏阳市| 固安县| 宁德市| 南召县| 银川市| 明星| 石家庄市| 灵石县| 手机| 冕宁县| 神农架林区| 乌鲁木齐市| 邮箱| 阜南县| 宝山区| 顺平县| 泾阳县| 肇庆市| 建瓯市| 长白| 九龙县| 商丘市| 肥乡县| 筠连县| 佳木斯市| 台东市| 揭阳市| 耒阳市| 大城县| 遂溪县| 巴林右旗| 白河县| 清流县| 泸水县|