如何为枚举类型添加说明
枚举类型大家在平时程序中经常会用到,先看下面的列子
1 enum Orientation 2 { 3 East, 4 South, 5 West, 6 North 7 }
上面代码定义了一个方向的枚举类型,包括东、南、西、北四个值,这样似乎也没有问题,但是我们是中国人,有时候看中文会更加习惯一些,更重要的是在做数据显示的时候,利用Enum.GetNames方法也只能获得像“North”这样的英文,而得不到理想中的“北”。这种情况,尤其是在数据绑定的时候将十分的麻烦,还需要另外写代码将“东、南、西、北”的字符定义出来,再与具体的枚举值关联起来。
为了解决这个问题,可以直接将值的字符串定义成中文,如下所示。
1 enum Orientation 2 { 3 东, 4 南, 5 西, 6 北 7 }
这样,通过Enum.GetNames方法就可以获得“东、南、西、北”这样的字符了。但是这样的编码也太违背编码习惯了,毕竟中文字符变量让人看起来十分的别扭。如何解决这个问题呢?答案就是使用Attribute!下面就是示例代码。
1 enum Orientation 2 { 3 [DescriptionAttribute("东")] 4 East, 5 [DescriptionAttribute("南")] 6 South, 7 [DescriptionAttribute("西")] 8 West, 9 [DescriptionAttribute("北")] 10 North 11 }
但又如何获取DescriptionAttribute的内容呢?呵呵,答案就是通过反射。下面是我封装获取DescriptionAttribute内容的扩展方法。
1 static string GetDescription<T>(this T value) 2 { 3 var memInfo = value.GetType().GetMember(value.ToString()); 4 var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).Cast<DescriptionAttribute>(); 5 if (attributes.Any()) 6 return attributes.First().Description; 7 return string.Empty; 8 }
下面就是测试的代码以及测试结果
1 static class Program 2 { 3 enum Orientation 4 { 5 [DescriptionAttribute("东")] 6 East, 7 [DescriptionAttribute("南")] 8 South, 9 [DescriptionAttribute("西")] 10 West, 11 [DescriptionAttribute("北")] 12 North 13 } 14 static string GetDescription<T>(this T value) 15 { 16 var memInfo = value.GetType().GetMember(value.ToString()); 17 var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false).Cast<DescriptionAttribute>(); 18 if (attributes.Any()) 19 return attributes.First().Description; 20 return string.Empty; 21 } 22 static void Main() 23 { 24 foreach (var s in Enum.GetValues(typeof(Orientation))) 25 { 26 Console.WriteLine("值:{0}\t\t说明:{1}",s.ToString(),s.GetDescription()); 27 } 28 } 29 }
从输出可以看出,程序成功的获取了枚举值的说明内容,这样就可以利用这种模式方便的对枚举值添加中文说明,然后在需要的时候提取出来,如:需要做数据绑定的时候。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库