Attribute 在 C# 中是一個非常強大的特性,它能夠給你的程式集新增元資料資訊。
Attribute 實際上是一個物件,它可以與以下元素中的任何一個相關聯: 程式集、類、方法、委託、列舉、事件、欄位、介面、屬性和結構,它會在這些物件上做資訊宣告,當程式執行之後,你可以透過反射來獲取關聯到這些物件上的 Attribute 資訊,換句話說:你可以透過 Atrribute 向程式集註入一些額外資訊,然後在執行時透過反射來獲取,attribute 一般由 名字 + 一些可選引數
構成, attribute 名字對應著 atrribute 類。
你可以利用 attribute 去校驗你的業務model的正確性, attribute 有兩種:內建 + 自定義
, 前者是 .net framework 框架的組成部分,後者需要透過繼承 System.Attribute
類來實現自定義。
現在來看看程式碼怎麼寫,Obsolete
特性用來標記一個方法是過時的,這個過時的意思是:你不應該再使用這個方法了,未來框架也會將其剔除,目前也存在其替代方案
。其實在第三方框架中有很多這樣的例子,下面的程式碼片段展示瞭如何在方法頂部使用 Obsolete
特性。
[Obsolete("This method is obsolete...")]public static void DoSomeWork(){}
如果你在程式中呼叫了這個方法,當你編譯程式碼時,在 Visual Studio 輸出視窗中會現在一些警告資訊,如下圖:
當然,如果你一定要忽視它也是可以的,現在,假如你希望你的開發同事不允許呼叫這個方法,那如何去限定呢?哈哈,可以使用 Obsolete 的第二個引數,這個引數是可選的,下面是 DoSomeWork()
方法的修改版本,請注意這是一個 Boolean 型引數。
[Obsolete("This method is obsolete...", true)] public static void DoSomeWork() { }
當把 true 給了這個可選引數後,再次編譯程式碼,你會發現程式碼根本編譯不透過,是不是完美的解決了你的問題,是吧! 截圖如下:
自定義 attribute這一小節我們來看一下如何去實現自定義的 attribute,要想自定義實現,可以建立一個類並繼承 System.Attribute
類即可,如下程式碼所示:
using System;public class CustomAttribute : Attribute{}
要想限定 CustomAttribute 的使用,可以用 AttributeUsage 類去標記,這個類包含了如下屬性: ValidOn
,AllowMultiple
,Inherited
等等,這些標記都可以限定 CustomAttribute 的使用。
下面的程式碼片段展示了 CustomAttribute 的修改版本,這個類使用建構函式去給內部的私有 string 賦值,程式碼僅僅用於演示目的。
[AttributeUsage(AttributeTargets.All)] public class CustomAttribute : Attribute { private string text; public CustomAttribute(string text) { this.Text = text; } public string Text { get => text; set => text = value; } }
當然你也可以按需去指定這些 AttributeTargets,如下程式碼所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class CustomAttribute : Attribute { private string text; public CustomAttribute(string text) { this.Text = text; } public string Text { get => text; set => text = value; } }
接下來你可以用反射來獲取應用到物件上的所有attributes,程式碼如下:
static void Main(string[] args) { MemberInfo memberInfo = typeof(CustomAttribute); object[] attributes = memberInfo.GetCustomAttributes(true); for (int i = 0, j = attributes.Length; i < j; i++) { Console.WriteLine(attributes[i]); } }
接下來我準備將 CustomAttribute 類應用到 下面的 SomeClass 類上。
[CustomAttribute("Hello World...")]public class SomeClass{}
可以著重看下 CustomAttribute 是如何安插在 SomeClass 上的,而且我還傳遞了一個 Hello World...
字串給它,下面的程式碼展示瞭如何將 CustomAttribute 中的 Text 屬性打印出來。
class Program { static void Main(string[] args) { MemberInfo memberInfo = typeof(SomeClass); object[] attributes = memberInfo.GetCustomAttributes(true); foreach (object attribute in attributes) { CustomAttribute customAttribute = attribute as CustomAttribute; if (customAttribute != null) Console.WriteLine("Text = {0}", customAttribute.Text); else Console.WriteLine(); } } } [CustomAttribute("Hello World...")] public class SomeClass { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property, AllowMultiple = true)] public class CustomAttribute : Attribute { private string text; public CustomAttribute(string text) { this.Text = text; } public string Text { get => text; set => text = value; } }