.net c#獲取自定義Attribute

前言: 在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 ,轉摘請註明。愛編程愛生活!!!

相關文章
相關標籤/搜索