成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文說通C#的屬性Attribute

開發 后端
屬性Attributes在C#中很常用,但事實上很多人對這個東西又很陌生。從概念上講,屬性提供的是將元數據關系到元素的一種方式。

[[392994]]

一、屬性

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

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

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

  1. [Flags] //Attribute 
  2. public enum DayOfWeek 
  3.     Sunday = 1, 
  4.     Monday = 2, 
  5.     Tuesday = 4, 
  6.     Wednesday = 8, 
  7.     Thursday = 16, 
  8.     Friday = 32, 
  9.     Saturday = 64 

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

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

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

  1. [Serializable
  2. public class SerializableClass { /*...*/ } 

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

二、自定義屬性

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

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

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

  1. public class MobileInformationAttribute : Attribute 
  2.     public string brand { get; set; } 
  3.     public int yearOfProduct { get; set; } 
  4.  
  5.     public MobileInformationAttribute(string Brand, int YearOfProduct) 
  6.     { 
  7.         brand = Brand; 
  8.         yearOfProduct = YearOfProduct; 
  9.     } 

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

三、使用屬性

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

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

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

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

  1. public class abc : Attribute { /*...*/ } 
  2.  
  3. [abc("Apple", 2021)] 
  4. public class IPhone12 { /*...*/ } 

四、限制屬性

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

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

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

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

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

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

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

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

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

五、訪問屬性

有了屬性,怎么訪問呢?

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

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

六、反射訪問

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

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

  1. int myInt = 5; 
  2. Type type = myInt.GetType(); 
  3. Console.WriteLine(type); 

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

  1. Assembly assembly = typeof(DateTime).Assembly; 
  2. Console.WriteLine(assembly); 
  3.  
  4. Assembly mobileAssembly = typeof(IPhone12).Assembly; 
  5. Console.WriteLine(mobileAssembly); 

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

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

  1. public class ReflectedClass 
  2.     public string Property1 { get; set; } 
  3.  
  4.     public int Add(int firstint second
  5.     { 
  6.         return first + second
  7.     } 
  8.  
  9. ReflectedClass reflected = new ReflectedClass(); 
  10. MemberInfo member = reflected.GetType().GetMethod("Add"); 
  11. Console.WriteLine(member); //Int32 Add(Int32, Int32) 

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

  1. PropertyInfo property = reflected.GetType().GetProperty("Property1"); 
  2. Console.WriteLine(property); //System.String Property1 
  3.  
  4. ConstructorInfo constructor = reflected.GetType().GetConstructor(new Type[0]); 
  5. Console.WriteLine(constructor); //Void .ctor() 

七、使用反射創建實例

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

來看看這個方法的使用:

  1. ReflectedClass newReflected = new ReflectedClass(); 
  2.  
  3. var reflectedType = newReflected.GetType(); 
  4.  
  5. object newObject = Activator.CreateInstance(reflectedType); 
  6. Console.WriteLine(newObject); 

八、使用反射處理泛型

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

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

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

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

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

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

九、總結

寫得好像有點亂。

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

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

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

 

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

 

責任編輯:武曉燕 來源: 老王Plus
相關推薦

2021-09-15 06:55:34

異步LinqC#

2021-01-27 08:12:04

Dotnet函數數據

2022-04-28 10:41:08

SaaS業務方式

2019-11-12 15:11:45

秒殺流量高可用

2021-07-31 23:14:26

OpenCL框架語言

2021-12-15 09:32:41

Linux系統負載

2025-04-22 08:57:27

2018-05-22 10:09:09

數據庫MySQL優化原理

2024-04-28 08:14:29

C#隊列Queue

2024-05-30 08:05:17

2020-05-11 07:57:33

區塊鏈分布式鏈上

2019-01-29 09:36:10

MySQLACID特性

2023-01-26 01:09:31

配置數據源參數

2024-02-22 14:20:44

數字化轉型數字化

2009-08-03 14:42:50

C#自定義控件

2020-01-22 16:50:32

區塊鏈技術智能

2009-08-04 14:25:09

學習C#Attribute與P

2009-09-11 11:16:53

C# Attribut

2022-10-08 06:38:01

元宇宙NFT加密貨幣

2025-01-14 17:00:00

SpringBoot開發代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品欧美一区二区在线观看视频 | 久久久久香蕉视频 | 国产成人自拍一区 | av中文字幕在线 | 国产成人在线播放 | 国产在线一区二区三区 | 精品二区 | 国产成人精品久久久 | 伊人网综合在线观看 | 国产做爰| 91丨国产 | 中文字幕在线看人 | 中文字幕高清免费日韩视频在线 | 亚洲精品免费视频 | 2021天天干夜夜爽 | 二区av| www.久久.com | 日韩av成人在线观看 | 国产精品久久久久久久久动漫 | 狠狠爱一区二区三区 | 国产伊人精品 | 一久久久 | 国产精品污www一区二区三区 | 久久国产麻豆 | 国产99久久精品一区二区永久免费 | 国产精品欧美精品 | 国产精品一区二区久久 | 国产精品美女久久久久久免费 | 欧美激情欧美激情在线五月 | 久久亚洲一区二区三区四区 | 亚洲综合在线播放 | 精品九九| 欧美日韩一区二区在线观看 | 日本国产高清 | 亚洲一区国产 | 久久五月婷 | 欧美videosex性极品hd | 久久中文视频 | 国产欧美精品一区二区色综合朱莉 | 免费播放一级片 | 狠狠狠色丁香婷婷综合久久五月 |