.NET Core使用自定义Attribute获取Enum枚举对应描述的方法

1、应用场景

正常的前后端分离开发,都是定义好枚举,前端自己去转换,但是如果需要做列表导出的时候,服务端也需要做枚举转换之后再导出到表格

定义枚举:建议枚举直接定义在命名空间(namespace)下,不要放在类(class)里面,而是和class平级

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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一样的

1
string userTypeName2 = UserTypeEnum.Nomal.GetEnmuText();

总结:扩展方法的使用很关键,如果不使用扩展方法,也可以正常调用

.GetEnumDescription((UserTypeEnum)nomal)  //参数是Enum类型

 

posted @   汪小让  阅读(1909)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示