日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

一文说通C#的属性Attribute

發布時間:2023/12/4 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文说通C#的属性Attribute 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

屬性Attributes這個東西,用好了可以省N多代碼。

?

一、屬性

屬性Attributes在C#中很常用,但事實上很多人對這個東西又很陌生。

從概念上講,屬性提供的是將元數據關系到元素的一種方式。

?

屬性使用的樣子,應該都見過:

[Flags]?//Attribute public?enum?DayOfWeek {Sunday?=?1,Monday?=?2,Tuesday?=?4,Wednesday?=?8,Thursday?=?16,Friday?=?32,Saturday?=?64 }

代碼中,Flags就是一個屬性。

通常,屬性會放在類、字段、方法等定義的上面,用來指定特定的內容。

?

.Net Framework框架提供了一些屬性。像常見的Serializable,用來告訴編譯器當前的類可以序列化成JSON或XML:

[Serializable] public?class?SerializableClass?{?/*...*/?}

?

需要注意的是,屬性在編譯時會嵌入到程序集中。這樣,我們可以使用反射來獲得相應的屬性值。

二、自定義屬性

自定義屬性用處很大,算是我自己比較常用的一個技術。

自定義屬性需要從System.Attribute抽象類來繼承。

?

想象一個場景。我們在構建一個手機類。我們需要一個屬性來表示手機一些信息,比方口牌和生產年份:

public?class?MobileInformationAttribute?:?Attribute {public?string?brand?{?get;?set;?}public?int?yearOfProduct?{?get;?set;?}public?MobileInformationAttribute(string?Brand,?int?YearOfProduct){brand?=?Brand;yearOfProduct?=?YearOfProduct;} }

我們會注意到:屬性是一個類,和其它類一樣,擁有字段、方法、構造函數和其它成員。

三、使用屬性

前面說了,屬性可以放在類、字段、方法等定義的上面。

我們來看看上面這個自定義屬性的使用:

[MobileInformation("Apple",?2021)] public?class?IPhone12?{?/*...*/?}

這兒需要注意一下:對于自定義屬性的名字,如果我們采用xxx+Attribute的名稱,則使用時我們可以用短名稱xxx。否則,就需要使用完整的名稱:

public?class?abc?:?Attribute?{?/*...*/?}[abc("Apple",?2021)] public?class?IPhone12?{?/*...*/?}

四、限制屬性

屬性本身也是一個類。所以屬性也可以用屬性來指定和修飾。

在修飾屬性的屬性中,有一個框架中的屬性用的很多,就是AttributeUsage。這個屬性用來限制自定義屬性可以修飾的元素類型:

[AttributeUsage(AttributeTargets.Class?|?AttributeTargets.Interface)] public?class?MobileInformationAttribute?:?Attribute?{?/*...*/?}

AttributeTargets是一個枚舉,有很多選項,包括類、接口、方法、構造函數、枚舉、程序集等。

上邊的代碼,我們限定了屬性只用于指定和修飾類和接口。所以,如果用這個屬性來修飾一個字段,編譯器會報錯。

?

AttributeUsage還允許我們定義從修飾對象繼承的對象,是否也獲得屬性:

[AttributeUsage(AttributeTargets.Class?|?AttributeTargets.Interface,?Inherited?=?true)] public?class?MobileInformationAttribute?:?Attribute?{?/*...*/?}

以及該屬性是否可以在一個元素上有多個實例:

[AttributeUsage(AttributeTargets.Class?|?AttributeTargets.Interface,?AllowMultiple?=?false)] public?class?MobileInformationAttribute?:?Attribute?{?/*...*/?}

五、訪問屬性

有了屬性,怎么訪問呢?

框架提供了一個方法Attribute.GetCustomAttribute():

var?mobileType?=?typeof(IPhone12); var?attributeType?=?typeof(MobileInformationAttribute); var?attribute?=?(MobileInformationAttribute)Attribute.GetCustomAttribute(mobileType,?attributeType); Console.WriteLine($"Mobile?is?{attribute.brand}?{attribute.yearOfProduct}");

六、反射訪問

反射最主要的作用,是用來收集對象的數據,而不是對象本身的數據。這些數據包括對象的類型,以及關于對象成員(包括方法、屬性、構造函數)的信息,和關于特定程序集的信息。此外,還包括存儲在元素屬性中的任何信息。

最簡單的反射,就是GetType()方法。

int?myInt?=?5; Type?type?=?myInt.GetType(); Console.WriteLine(type);

除此之外,我們還可以使用反射來獲取關于包含給定類型的程序集的信息:

Assembly?assembly?=?typeof(DateTime).Assembly; Console.WriteLine(assembly);Assembly?mobileAssembly?=?typeof(IPhone12).Assembly; Console.WriteLine(mobileAssembly);

關于反射的內容,不展開討論。

這兒說的,是通過反射獲取類中方法的信息:

public?class?ReflectedClass {public?string?Property1?{?get;?set;?}public?int?Add(int?first,?int?second){return?first?+?second;} }ReflectedClass?reflected?=?new?ReflectedClass(); MemberInfo?member?=?reflected.GetType().GetMethod("Add"); Console.WriteLine(member);?//Int32?Add(Int32,?Int32)

同樣,還可能通過反射獲得關于已定義的屬性的信息,以及關于對象的構造函數的信息:

PropertyInfo?property?=?reflected.GetType().GetProperty("Property1"); Console.WriteLine(property);?//System.String?Property1ConstructorInfo?constructor?=?reflected.GetType().GetConstructor(new?Type[0]); Console.WriteLine(constructor);?//Void?.ctor()

七、使用反射創建實例

這個需要用到system.Activator。這是一個非常強大的類,可以從類型創建對象的實例。

來看看這個方法的使用:

ReflectedClass?newReflected?=?new?ReflectedClass();var?reflectedType?=?newReflected.GetType();object?newObject?=?Activator.CreateInstance(reflectedType); Console.WriteLine(newObject);

八、使用反射處理泛型

使用反射處理泛型會比處理普通類型麻煩一點。

這里需要知道,Type類上有一個屬性用來標識類型是不是泛型:

List<int>?numbers?=?new?List<int>?{?1,?2,?3,?4,?5,?6,?7?}; Console.WriteLine(numbers.GetType().IsGenericType);

同樣,我們也可以用反射來創建一個泛型的實例:

List<int>?numbers?=?new?List<int>?{?1,?2,?3,?4,?5,?6,?7?};Type?d?=?numbers.GetType().GetGenericTypeDefinition();Type[]?typeArgs?=?new?Type[]?{?typeof(int)?};Type?constructed?=?d.MakeGenericType(typeArgs);object?list?=?Activator.CreateInstance(constructed);Console.WriteLine(list.GetType());

有一點復雜,但可以實現。

九、總結

寫得好像有點亂。

總結一下,屬性將元數據分配給元素,包括類、字段、方法等等。該元數據在構建項目時被編譯,并描述元素,而不是元素的數據。

可以創建從Attribute類繼承的自定義屬性。可以使用AttributeUsage屬性來限制這些屬性的使用位置,并且可以使用反射來獲取屬性數據。

反射是一種技術,允許獲取關于元素(而不是元素本身)的元數據和信息。執行反射的最基本方法是使用GetType()方法,但是也可以使用反射來獲取關于方法、構造函數、字段等的信息。

可以使用反射來創建對象的實例,只要有了對象的類型。同時,使用反射創建泛型對象是可能的,但比較復雜,需要泛型對象的類型以及所有泛型參數的類型。

喜歡就來個三連,讓更多人因你而受益

總結

以上是生活随笔為你收集整理的一文说通C#的属性Attribute的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩国91视频 | 天天摸日日干 | a级片免费视频 | 日韩乱码人妻无码中文字幕 | 成人激情在线观看 | 99久久视频 | 欧美色交 | 国产精品久久久久久久无码 | 蜜桃免费在线视频 | 99久久精品国产毛片 | 国产69精品一区二区 | 长腿校花无力呻吟娇喘的视频 | 久久久精品在线 | 日韩大尺度视频 | 在线国产精品一区 | 国产精品日韩在线 | 丁香视频在线观看 | 欧美嫩草 | 精品一区二区三区成人免费视频 | 91亚洲国产成人精品一区二三 | 国产精品.com | 亚洲av成人无码久久精品老人 | 日本www色 | 国产精品久久久久久久久久久久久久 | 久久xx| 理论片91 | 91av日本| 国产大片一区 | 国产性猛交xxxⅹ交酡全过程 | 奇米成人 | 久久久免费观看视频 | 国产无码精品在线观看 | juliaann精品艳妇hd | 手机免费在线观看av | 99精品在线播放 | 日噜噜夜噜噜 | 欧美日韩中字 | 黄色av在 | 在线视频91| 欧美成人r级一区二区三区 中文无码一区二区三区在线观看 | 少女国产免费观看 | 成人五区| www在线播放 | 91成人国产综合久久精品 | 电影《走路上学》免费 | 美女色呦呦 | 国产在线拍揄自揄拍无码视频 | 18视频在线观看娇喘 | 国产精品一区二区三区免费观看 | 亚洲图片小说视频 | 欧美激情久久久久 | 中文在线观看免费网站 | 国产主播一区二区 | 三级自拍 | 999在线视频| 看片久久 | 又白又嫩毛又多15p 超碰在线一区 | 日韩国产欧美一区二区三区 | 午夜日韩电影 | 久久精品久久精品久久精品 | 国产成人三级 | 99久久精品国产色欲 | 少妇一级淫片免费播放 | 美国成人av | 高潮一区二区三区 | 天堂网男人| 99re在线观看 | 五月婷在线 | 吊侵犯の奶水授乳羞羞漫画 | 日本成人在线不卡 | 草草影院地址 | 国产,日韩,欧美 | 深夜久久 | 成年人高清视频 | 人人cao| 91视频二区 | 黄色美女免费网站 | 国产精品va无码一区二区 | 国产超碰在线观看 | 爱情岛亚洲品质自拍极速福利网站 | 国产一区二区视频在线观看 | 国产九色91回来了 | japanese21ⅹxx日本 | 视频一区二区欧美 | 精品久久久久久久久久 | 国产一av | 久久久久久久偷拍 | 隔壁邻居是巨爆乳寡妇 | 麻豆人妻少妇精品无码专区 | 亚洲第一页综合 | 久久av资源站 | 国产精品污www一区二区三区 | 一起操在线观看 | 91av福利| 中文字幕一区二区人妻视频 | 日本久久久久久久久久久 | 国产欧美日韩高清 | 老司机免费精品视频 | 黄色网在线播放 |