.NET Core使用自定义Attribute获取Enum枚举对应描述的方法
1、应用场景
正常的前后端分离开发,都是定义好枚举,前端自己去转换,但是如果需要做列表导出的时候,服务端也需要做枚举转换之后再导出到表格
定义枚举:建议枚举直接定义在命名空间(namespace)下,不要放在类(class)里面,而是和class平级
代码如下:
namespace StudyProject { /// <summary> /// 用户类型枚举 /// </summary> public enum UserTypeEnum { [Description("超级管理员")] Admin = 0, [Description("普通用户")] Nomal = 1, [Description("VIP会员")] VIP = 2, } }
2、获取枚举描述
1)使用系统自带的DescriptionAttribute,需要using System.ComponentModel;
使用方法:
第一步:在定义枚举的时候加上Description属性(如上图)
第二步:定义静态扩展方法
代码如下:
public static class CommonEnumUtil { public static string GetEnmuDescription(this Enum value) { var name = value.ToString(); var field = value.GetType().GetField(name); if (field == null) { return name; } var att = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute), false); return att == null ? field.Name : ((DescriptionAttribute)att).Description; } }
知识点:使用this关键字定义参数作为扩展方法(只能用在静态类的静态方法中)
扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
这样做的好处是:调用方法的时候只需要 using StudyProject;(命名空间),所有 Enum类型的对象就都拥有了 GetEnmuDescription() 这个方法,而无需你重写一个 Enum类,比如:
string userTypeName = UserTypeEnum.Admin.GetEnmuDescription();
第三步:调用方法获取枚举描述
枚举类型.GetEnmuDescription()就可以了
UserTypeEnum.Admin.GetEnmuDescription()
代码如下:
namespace StudyProject { class Program { static void Main(string[] args) { string userTypeName = UserTypeEnum.Admin.GetEnmuDescription(); string userTypeName2 = UserTypeEnum.Nomal.GetEnmuText(); Console.WriteLine("用户类型:"+ userTypeName); Console.WriteLine("用户类型:" + userTypeName2); Console.ReadLine(); } } }
2)使用自定义Attribute(其实原理和DescriptionAttribute一样)
其实有上面的方法就够用了,不过使用自定义Attribute也可以巩固一下Attribute的用法,增强理解
跟上面相比,就是多加一个自定义的TextAttribute
代码如下:
public class TextAttribute : Attribute { public TextAttribute(string value) { Value = value; } public string Value { get; set; } }
获取Text的方法稍有不同
代码如下:
public static string GetEnmuText(this Enum value) { var name = value.ToString(); var field = value.GetType().GetField(name); if (field == null) { return name; } var att = Attribute.GetCustomAttribute(field, typeof(TextAttribute), false); return att == null ? field.Name : ((TextAttribute)att).Value; }
调用方法和Description一样的
string userTypeName2 = UserTypeEnum.Nomal.GetEnmuText();
总结:扩展方法的使用很关键,如果不使用扩展方法,也可以正常调用
.GetEnumDescription((UserTypeEnum)nomal) //参数是Enum类型
本文来自博客园,作者:汪小让,转载请注明原文链接:https://www.cnblogs.com/wangxiaorang/p/15343833.html