C#枚举类型常用扩展方法
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; } } }
JAVA&NET技术QQ群号:456257217有问题的可以在群里面提问。