【基礎】Attribute的妙用
阿新 • • 發佈:2017-11-16
.net main 屬性。 常用 現狀 void 例子 exc 作者
一、何為Attribute
下面是微軟官方對Attribute的解釋:
公共語言運行時允許你添加類似關鍵字的描述聲明,叫做Attributes,它對程序中的元素進行標註,如類型、字段、方法和屬性等。Attributes和Microsoft .NET Framework文件的元數據保存在一起,可以用來向運行時描述你的代碼,或者在程序運行的時候影響應用程序的行為。
通俗地理解,就是對目標對象(程序集、類、方法等)進行擴展,使得在運行時可以獲取到被擴展對象的額外的信息,通過額外的信息來影響目標對象的行為。上面這句話純粹是個人的理解,如有不妥希望指教。
二、使用Attribute
現在我有一個需求,創建一個包含 三個靜態方法的類,如果某個方法被打上了標簽,並且標簽的Flag是1,那麽就執行該方法,否則就不執行。看起來有點像過濾器,那麽如何來實現這個小需求呢?首先要創建一個靜態類MethodToRun,該類有三個靜態方法分別是Run、Walk、Go,代碼如下:
1 public class MethodToRun 2 { 3 public static void Run () 4 { 5 Console.WriteLine("Run Run Hurry Up!"); 6 Console.ReadLine(); 7 } 8 9 public static void Walk() 10 { 11 Console.WriteLine("Walk Slowly~"); 12 Console.ReadLine();13 } 14 15 public static void Go() 16 { 17 Console.WriteLine("Go Go Go!"); 18 Console.ReadLine(); 19 } 20 }
好了,有了以上的類,接下來開始創建我們自定義的Attribute,為了和Property屬性做個區分,我稱之為特性。取個名字叫ExcuteAttribute,擁有一個Flag屬性,代碼如下:
1 [AttributeUsage(AttributeTargets.Method)] 2 publicclass ExcuteAttribute : Attribute 3 { 4 public int Flag { get; set; } 5 }
上述代碼第一行指定了該特性作用的範圍,回頭看下我們之前說的一句話:
就是對目標對象(程序集、類、方法等)進行擴展,使得在運行時可以獲取到被擴展對象的額外的信息,通過額外的信息來影響目標對象的行為。
這裏的AttributeUsage中的參數AttributeTargets就是目標對象,它是一個枚舉類型,具體的枚舉如下:
1 //指定可以對它們應用屬性的應用程序元素。 2 [ComVisible(true)] 3 [Flags] 4 public enum AttributeTargets 5 { 6 //可以對程序集應用屬性。 7 Assembly = 1, 8 9 //可以對模塊應用屬性。 10 Module = 2, 11 12 //可以對類應用屬性。 13 Class = 4, 14 15 //可以對結構應用屬性,即值類型。 16 Struct = 8, 17 18 //可以對枚舉應用屬性。 19 Enum = 16, 20 21 //可以對構造函數應用屬性。 22 Constructor = 32, 23 24 //可以對方法應用屬性。 25 Method = 64, 26 27 //可以對屬性 (Property) 應用屬性 (Attribute)。 28 Property = 128, 29 30 //可以對字段應用屬性。 31 Field = 256, 32 33 //可以對事件應用屬性。 34 Event = 512, 35 36 //可以對接口應用屬性。 37 Interface = 1024, 38 39 //可以對參數應用屬性。 40 Parameter = 2048, 41 42 //可以對委托應用屬性。 43 Delegate = 4096, 44 45 //可以對返回值應用屬性。 46 ReturnValue = 8192, 47 48 //可以對泛型參數應用屬性。 49 GenericParameter = 16384, 50 51 //可以對任何應用程序元素應用屬性。 52 All = 32767 53 }