首頁>技術>

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 類去標記,這個類包含了如下屬性: ValidOnAllowMultiple,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; }    }

32
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 用Parallels 16在M1 Mac上執行Windows