C#獲取枚舉值特性(Display、Description、自定義特性)
一、Display特性
internal enum Days : byte
{
[Display(Name = "星期天", Description = "周日")]
Sunday,
[Display(Name = "星期一", Description = "周一"))]
Monday,
[Display(Name = "星期二", Description = "周二"))]
Tuesday,
[Display(Name = "星期三", Description = "周三"))]
Wednesday,
[Display(Name = "星期四", Description = "周四"))]
Thursday,
[Display(Name = "星期五", Description = "周五"))]
Friday,
[Display(Name = "星期六", Description = "周六"))]
Saturday
}
/// <summary>
/// 獲取特性 (DisplayAttribute) 的名稱;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDisplayName(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
DisplayAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[];
return attrs.Length > 0 ? attrs[0].Name : enumValue.ToString();
}
/// <summary>
/// 獲取特性 (DisplayAttribute) 的說明;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDisplayDescription(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
DisplayAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[];
return attrs.Length > 0 ? attrs[0].Description : enumValue.ToString();
}
調用如下:
Console.WriteLine(Days.Saturday.GetDisplayName()); // 輸出:星期六
Console.WriteLine(Days.Saturday.GetDisplayDescription()); // 輸出:周六
二、Description特性
枚舉定義:
internal enum Days : byte
{
[Description("星期天")]
Sunday,
[Description("星期一")]
Monday,
[Description("星期二")]
Tuesday,
[Description("星期三")]
Wednesday,
[Description("星期四")]
Thursday,
[Description("星期五")]
Friday,
[Description("星期六")]
Saturday
}
/// <summary>
/// 獲取特性 (DescriptionAttribute) 的說明;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDescription(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
DescriptionAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];
return attrs.Length > 0 ? attrs[0].Description : enumValue.ToString();
}
調用如下:
Console.WriteLine(Days.Saturday.GetDescription()); // 輸出:星期六
三、自定義特性
聲明一個class并繼承Attribute:
public class StringValueAttribute : Attribute
{
public StringValueAttribute(string value)
{
this.StringValue = value;
}
public string StringValue
{
[CompilerGenerated]
get;
[CompilerGenerated]
set;
}
}
枚舉擴展類:
public static class EnumExtensions
{
/// <summary>
/// 獲取特性 (DisplayAttribute) 的名稱;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetStringValue(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
StringValueAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
return attrs.Length > 0 ? attrs[0].StringValue : enumValue.ToString();
}
}
調用:
internal enum Days : byte
{
[StringValue("星期天")]
Sunday,
[StringValue("星期一")]
Monday,
[StringValue("星期二")]
Tuesday,
[StringValue("星期三")]
Wednesday,
[StringValue("星期四")]
Thursday,
[StringValue("星期五")]
Friday,
[StringValue("星期六")]
Saturday
}
Console.WriteLine(Days.Saturday.GetStringValue()); // 輸出:星期六
四、C#獲取枚舉值特性封裝
枚舉擴展方法類封裝:
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
namespace Lin.EnumExt
{
public static class EnumExtensions
{
/// <summary>
/// 獲取特性 (DisplayAttribute) 的名稱;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDisplayName(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
DisplayAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[];
return attrs.Length > 0 ? attrs[0].Name : enumValue.ToString();
}
/// <summary>
/// 獲取特性 (DisplayAttribute) 的說明;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDisplayDescription(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
DisplayAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(DisplayAttribute), false) as DisplayAttribute[];
return attrs.Length > 0 ? attrs[0].Description : enumValue.ToString();
}
/// <summary>
/// 獲取特性 (DescriptionAttribute) 的說明;如果未使用該特性,則返回枚舉的名稱。
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static string GetDescription(this Enum enumValue)
{
FieldInfo fieldInfo = enumValue.GetType().GetField(enumValue.ToString());
DescriptionAttribute[] attrs =
fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];
return attrs.Length > 0 ? attrs[0].Description : enumValue.ToString();
}
/// <summary>
/// 直接獲取特性(更輕量、更容易使用,不用封裝“獲取每一個自定義特性”的擴展方法)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="enumValue"></param>
/// <returns></returns>
public static T GetAttributeOfType<T>(this Enum enumValue) where T : Attribute
{
Type type = enumValue.GetType();
MemberInfo[] memInfo = type.GetMember(enumValue.ToString());
object[] attributes = memInfo[0].GetCustomAttributes(typeof(T), false);
return (attributes.Length > 0) ? (T)attributes[0] : null;
}
}
}