一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - .NET/C#如何判斷某個類是否是泛型類型或泛型接口的子類型詳解

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

2020-06-01 14:41呂毅 ASP.NET教程

這篇文章主要給大家介紹了關于.NET/C#如何判斷某個類是否是泛型類型或泛型接口的子類型的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧

前言

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

C#泛型特點:

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

2、C#泛型類型攜帶有豐富的元數據,因此C#的泛型類型可以應用于強大的反射技術。

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

.NET 中提供了很多判斷某個類型或實例是某個類的子類或某個接口的實現類的方法,然而這事情一旦牽扯到泛型就沒那么省心了。

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

.NET 中沒有自帶的方法

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

?
1
2
3
if (instance is Foo || instance is IFoo)
{
}

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

?
1
2
3
if (typeof(Foo).IsAssignableFrom(type) || typeof(IFoo).IsAssignableFrom(type))
{
}

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

?
1
2
3
if (type.IsSubClassOf(typeof(Foo)))
{
}

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

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

我們需要自己編寫方法

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

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

比如,我們要判斷接口:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/// <summary>
/// 判斷指定的類型 <paramref name="type"/> 是否是指定泛型類型的子類型,或實現了指定泛型接口。
/// </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);
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://walterlv.com/post/is-subclass-of-raw-generic-or-implemented-raw-generic.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品国产91热久久久久福利 | 色综合精品 | 久久成人精品免费播放 | 亚洲欧美日韩国产精品一区 | 亚洲精品国产乱码AV在线观看 | 欧美激情 亚洲 | 亚洲品质自拍视频网站 | 亚洲福利一区二区精品秒拍 | 丝瓜视频黄色在线观看 | 成人精品mv视频在线观看 | 亚洲午夜久久久久国产 | 4hu影院永久在线播放 | 娇妻被健身教练挺进小说阅读 | 亚洲精品AV无码永久无码 | 视频二区 素人 欧美 日韩 | 久见久热 这里只有精品 | 短篇小说肉 | 精品精品精品 | 国产福利视频一区二区微拍视频 | a v在线男人的天堂观看免费 | 精品国产自在现线久久 | 隔壁老王国产精品福利 | 国产美女亚洲精品久久久久久 | 秋霞午夜| 热九九精品 | 深夜网站在线观看 | 成人在线观看免费视频 | 亚洲网站在线播放 | 欧美日韩高清不卡一区二区三区 | 91久久夜色精品国产九色 | 亚洲精品一二三四 | 三级视频中文字幕 | 5566中文字幕亚洲精品 | 天干夜天天夜天干天ww | 亚洲精品无码不卡 | 国产盗摄wc厕所撒尿视频 | 白丝打脚枪| 手机看片日韩1024你懂的首页 | 欧美成人aa | 99re7在线精品免费视频 | 日本三不卡 |