C#高级:枚举(Enum)从索引、值到注释的完整使用技巧

目录

一、推荐的枚举写法

二、获取注释的封装代码

三、已知【枚举】,获取注释、索引

四、已知【索引】,获取枚举值、注释

五、已知【注释】,获取枚举值、索引

六、创建一个【枚举字典】,key=索引,value=(枚举值,注释)

七、全部代码展示(控制台程序)

八、输出结果


一、推荐的枚举写法

 public enum Level
 {
     [Description("无")]
     None = 0,

     [Description("一般")]
     Normal = 1,

     [Description("重要")]
     Important = 2,

     [Description("紧急")]
     Urgent = 3
 }

【不推荐的写法】没有索引值(或者索引值用字符串)、不写注释、命名马虎等

二、获取注释的封装代码

private static string GetEnumDescription(Enum value)
{
    var fieldInfo = value.GetType().GetField(value.ToString());
    var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
    return attribute?.Description ?? value.ToString();
}

【说明】有了上述该代码,实现索引、注释、枚举字符串的转化就相当容易了!

三、已知【枚举】,获取注释、索引

 Level enumdata = Level.Important;
 Console.WriteLine($"注释:{GetEnumDescription(enumdata)}");
 Console.WriteLine($"索引:{enumdata.GetHashCode()}");

四、已知【索引】,获取枚举值、注释

  int index = 1;
  Console.WriteLine($"枚举值(Level):{(Level)index}");
  Console.WriteLine($"枚举值(string):{((Level)index).ToString()}");
  Console.WriteLine($"注释(string):{GetEnumDescription((Level)index)}");

五、已知【注释】,获取枚举值、索引

这里需要多封装一个方法,如下所示:

 public static TEnum GetEnumByDescription<TEnum>(string description)
     where TEnum : Enum
 {
     foreach (var field in typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static))
     {
         if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
         {
             if (attribute.Description == description)
             {
                 return (TEnum)field.GetValue(null);
             }
         }
     }

     throw new ArgumentException($"枚举类型 {typeof(TEnum).FullName} 中找不到描述为 '{description}' 的枚举成员。");
 }

实现代码:

Level enumresult = GetEnumByDescription<Level>("紧急");
Console.WriteLine($"枚举值:{enumresult}");
Console.WriteLine($"索引值:{enumresult.GetHashCode()}");

六、创建一个【枚举字典】,key=索引,value=(枚举值,注释)

这里需要多封装一个方法,如下所示:

 private static Dictionary<int, (T, string)> GetDictionaryByEnum<T>() where T : Enum
 {
     // 创建一个字典来存储索引和枚举值/注释的对应关系
     Dictionary<int, (T, string)> enumDictionary = new Dictionary<int, (T, string)>();

     // 遍历枚举成员
     foreach (T enumValue in Enum.GetValues(typeof(T)))
     {
         // 获取枚举成员的整数值
         int enumIndex = enumValue.GetHashCode();

         // 获取枚举成员的描述信息(注释)
         string enumDescription = GetEnumDescription(enumValue);

         // 将索引和枚举值/注释的对应关系存入字典
         enumDictionary.Add(enumIndex, ((T)enumValue, enumDescription));
     }
     return enumDictionary;
 }

实现代码:

var dict = GetDictionaryByEnum<Level>();
foreach (var item in dict)
{
    Console.WriteLine($"索引:{item.Key},枚举值:{item.Value.Item1},注释:{item.Value.Item2}");
}

七、全部代码展示(控制台程序)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Xml.Linq;

namespace ConsoleApp1
{

    public class Program
    {
        public static TEnum GetEnumByDescription<TEnum>(string description)
            where TEnum : Enum
        {
            foreach (var field in typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
                {
                    if (attribute.Description == description)
                    {
                        return (TEnum)field.GetValue(null);
                    }
                }
            }

            throw new ArgumentException($"枚举类型 {typeof(TEnum).FullName} 中找不到描述为 '{description}' 的枚举成员。");
        }

        private static string GetEnumDescription(Enum value)
        {
            var fieldInfo = value.GetType().GetField(value.ToString());
            var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
            return attribute?.Description ?? value.ToString();
        }

        private static Dictionary<int, (T, string)> GetDictionaryByEnum<T>() where T : Enum
        {
            // 创建一个字典来存储索引和枚举值/注释的对应关系
            Dictionary<int, (T, string)> enumDictionary = new Dictionary<int, (T, string)>();

            // 遍历枚举成员
            foreach (T enumValue in Enum.GetValues(typeof(T)))
            {
                // 获取枚举成员的整数值
                int enumIndex = enumValue.GetHashCode();

                // 获取枚举成员的描述信息(注释)
                string enumDescription = GetEnumDescription(enumValue);

                // 将索引和枚举值/注释的对应关系存入字典
                enumDictionary.Add(enumIndex, ((T)enumValue, enumDescription));
            }
            return enumDictionary;
        }

        public enum Level
        {
            [Description("无")]
            None = 0,

            [Description("一般")]
            Normal = 1,

            [Description("重要")]
            Important = 2,

            [Description("紧急")]
            Urgent = 3
        }


        static void Main(string[] args)
        {

            //1.已知【枚举】,获取注释、索引
            Level enumdata = Level.Important;
            Console.WriteLine($"注释:{GetEnumDescription(enumdata)}");
            Console.WriteLine($"索引:{enumdata.GetHashCode()}");

            //
            //2.已知【索引】,获取枚举值、注释
            int index = 1;
            Console.WriteLine($"枚举值(Level):{(Level)index}");
            Console.WriteLine($"枚举值(string):{((Level)index).ToString()}");
            Console.WriteLine($"注释(string):{GetEnumDescription((Level)index)}");

            //3.已知【注释】,获取枚举值、索引
            Level enumresult = GetEnumByDescription<Level>("紧急");
            Console.WriteLine($"枚举值:{enumresult}");
            Console.WriteLine($"索引值:{enumresult.GetHashCode()}");

            //4.创建一个【枚举字典】,key=索引,value=(枚举值,注释)
            var dict = GetDictionaryByEnum<Level>();
            foreach (var item in dict)
            {
                Console.WriteLine($"索引:{item.Key},枚举值:{item.Value.Item1},注释:{item.Value.Item2}");
            }

        }

        
    }

}


八、输出结果

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值