前言: 在c#開發中,有時候咱們須要讀取 Attribute中的信息(關於Attribute , 我本身把他理解成一個能夠爲類,屬性標記的東西,這個標記能夠爲你提供一些關於類,方法,屬性的額外信息)編程
咱們如何獲取這些標記的信息,如何獲取自定義Attribute信息。c#
正文:spa
1.獲取一個枚舉的詳細信息code
假設咱們有這樣一個枚舉ip
public enum Category { /// <summary> /// 英語 /// </summary> English, /// <summary> /// 漢語 /// </summary> Chinese, /// <summary> /// 日語 /// </summary> Japanese }
如今我要獲取每一個枚舉的描述信息。 若是你不了Attribute,或許你只能這樣獲取
static class Program { static void Main() { var category = Category.Chinese; switch (category) { case Category.Chinese: Console.WriteLine("中文"); break; case Category.English: Console.WriteLine("英文"); break; case Category.Japanese: Console.WriteLine("日語"); break; } } }
彷佛幾個Case語句也能完成任務。 可是若是枚舉項個數超多,那這種寫法無疑很醜陋。ci
----------------------------------華麗分割線------------------------------------開發
接下來探討 Attribute的一種簡單應用場景get
修改枚舉源碼
public enum Category { /// <summary> /// 英語 /// </summary> [Description("西洋文")] English, /// <summary> /// 漢語 /// </summary> [Description("漢語")] Chinese, /// <summary> /// 日語 /// </summary> [Description("日本話")] Japanese }
每一個枚舉項加入System.ComponentModel命名空間的 DescriptionAttribute,不清楚能夠msdn一下。string
而後附上兩個算我原創的類吧...記得層在公司使用過直接獲取 Descripton標記的方法,可是沒有源碼,我花了一天時間來查詢這個問題,終於寫出了本身的幫助類.奉獻給你們..
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ZyTools { /// <summary> /// 枚舉幫助類 /// </summary> public class EnumHelper { /// <summary> /// 獲取枚舉項的Attribute /// </summary> /// <typeparam name="T">自定義的Attribute</typeparam> /// <param name="source">枚舉</param> /// <returns>返回枚舉,不然返回null</returns> public static T GetCustomAttribute<T>(Enum source) where T : Attribute { Type sourceType = source.GetType(); string sourceName = Enum.GetName(sourceType, source); FieldInfo field = sourceType.GetField(sourceName); object[] attributes = field.GetCustomAttributes(typeof(T), false); foreach (object attribute in attributes) { if (attribute is T) return (T)attribute; } return null; } /// <summary> ///獲取DescriptionAttribute描述 /// </summary> /// <param name="source">枚舉</param> /// <returns>有description標記,返回標記描述,不然返回null</returns> public static string GetDescription(Enum source) { var attr = GetCustomAttribute<System.ComponentModel.DescriptionAttribute>(source); if (attr == null) return null; return attr.Description; } } }
如今咱們只須要,這樣寫代碼了.
var category = Category.Chinese; Console.WriteLine(EnumHelper.GetDescription(category));
是否是很清爽 .但願本文對初學者有所幫助,來源於www.xiaoniusoft.com ,轉摘請註明。愛編程愛生活!!!