1. 程式人生 > >.net c#獲取自定義Attribute

.net c#獲取自定義Attribute

前言: 在c#開發中,有時候我們需要讀取 Attribute中的資訊(關於Attribute , 我自己把他理解成一個可以為類,屬性標記的東西,這個標記可以為你提供一些關於類,方法,屬性的額外資訊)

我們如何獲取這些標記的資訊,如何獲取自定義Attribute資訊。

正文:

1.獲取一個列舉的詳細資訊

假設我們有這樣一個列舉

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語句也能完成任務。 但是如果列舉項個數超多,那這種寫法無疑很醜陋。

----------------------------------華麗分割線------------------------------------

接下來探討 Attribute的一種簡單應用場景

修改列舉

public enum Category
    {
        /// <summary>
        /// 英語
        /// </summary>
        [Description("西洋文")]
        English,
        /// <summary>
        /// 漢語
        /// </summary>
        [Description("漢語")]
        Chinese,
        /// <summary>
        /// 日語
        /// </summary>
        [Description("日本話")]
        Japanese
    }

每個列舉項加入System.ComponentModel名稱空間的 DescriptionAttribute,不清楚可以msdn一下。

然後附上兩個算我原創的類吧...記得層在公司使用過直接獲取 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 ,轉摘請註明。愛程式設計愛生活!!!