目录
六、创建一个【枚举字典】,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}");
}
}
}
}
八、输出结果
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » C#高级:枚举(Enum)从索引、值到注释的完整使用技巧
发表评论 取消回复