.net c#獲取自定義Attribute
阿新 • • 發佈:2019-01-31
前言: 在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 ,轉摘請註明。愛程式設計愛生活!!!