zoukankan      html  css  js  c++  java
  • .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类型

  • 相关阅读:
    C#下解决DrawImage画出来的Image变大了的问题
    WPF的TextBox产生内存泄露的情况
    【技术积累】【C#】创建符号链接
    Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
    Wix学习整理(5)——安装时填写注册表
    Wix学习整理(4)——关于WiX文件格式和案例HelloWorld的分析
    【技术积累】【C#】生成字符串的MD5值
    Wix学习整理(6)——安装快捷方式
    【小技巧积累】设置ListView控件的Item不在Tab键导航序列中
    修改Windows的本地hosts文件以访问facebook
  • 原文地址:https://www.cnblogs.com/wangxiaorang/p/15343833.html
Copyright © 2011-2022 走看看