1. 程式人生 > >【基礎】Attribute的妙用

【基礎】Attribute的妙用

.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 public
class 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 }