亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#的屬性Attribute的作用

發布時間:2021-08-26 20:51:20 來源:億速云 閱讀:181 作者:chen 欄目:編程語言

這篇文章主要介紹“C#的屬性Attribute的作用”,在日常操作中,相信很多人在C#的屬性Attribute的作用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#的屬性Attribute的作用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、屬性

屬性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 Property1  ConstructorInfo 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());

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

到此,關于“C#的屬性Attribute的作用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鸡泽县| 紫阳县| 郎溪县| 子洲县| 永康市| 夏津县| 阜新市| 崇文区| 南川市| 邳州市| 灵石县| 九龙城区| 眉山市| 永修县| 元谋县| 新沂市| 阳春市| 灵石县| 龙井市| 册亨县| 河北区| 来凤县| 中牟县| 贵溪市| 新余市| 讷河市| 苏尼特左旗| 三台县| 开封市| 铁岭县| 弥勒县| 南昌市| 孟连| 普安县| 长泰县| 舒兰市| 白朗县| 崇阳县| 甘南县| 海丰县| 沁水县|