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;
}
}
}