示例:

有人为了显示中文,这样定义枚举吗?

publicenum TimeOfDay    {        上午,        下午,        晚上    };

这样定义,很别扭,特别是在使用的时候,

比如,this.Time = TimeOfDay.上午;

而且你会逐渐发现它的局限性。

枚举定义很头疼:

在系统开发中,我们经常使用枚举,但是定义枚举是个头疼的问题。

按照习惯我们习惯将枚举项定义为英语,但是,在使用的时候,特别针对国内客户的时候,如果显示的英文,则不符合要求,不易于用户使用。

尽管现在枚举定义也能定义中文枚举项,但在优雅的英文代码中穿插着中语,确实很不爽。如果涉及多语,很难扩展。

也有人经常用到常量来代替枚举,但这种方法在系统开发中不太可取,具体见:枚举与常量。

解决方案:

为了方便用户使用, 希望能够找到一种比较好的方法,将枚举转为我们想要的集合。

枚举的定义中加入描述,如果要支持多语,则直接修改枚举描述即可。也不用修改其他代码。

通过反射思想,得到针对某一枚举类型的描述。具体实现起来,有如下代码中的三个不同的的方式。

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Reflection;
using System.ComponentModel;namespace EnumApp
{class Program{static void Main(string[] args){NameValueCollection nvc = GetNVCFromEnumValue(typeof(TimeOfDay));Console.WriteLine("1. 反射方式对TimeOfDay结构体的罗列:");foreach (string key in nvc.Keys){Console.WriteLine(string.Format(key + ": {0}", nvc[key]));}Console.WriteLine("\n2. 直接方式1,对TimeOfDay结构体的罗列:");Dictionary<string, string> dic = GetEnumDic(typeof(TimeOfDay));foreach (string key in dic.Keys){Console.WriteLine(key + ":{0}", dic[key]);}Console.WriteLine("\n3. 直接方式2,对TimeOfDay结构体中某一项的描述:");Console.WriteLine(string.Format(TimeOfDay.Moning.ToString() + ":{0}", GetEnumDes(TimeOfDay.Moning)));}/// <summary>/// 从枚举类型和它的特性读出并返回一个键值对/// </summary>/// <param name="enumType">Type,该参数的格式为typeof(需要读的枚举类型)</param>/// <returns>键值对</returns>public static NameValueCollection GetNVCFromEnumValue(Type enumType){System.Reflection.FieldInfo[] fields;string strText, strValue;NameValueCollection nvc = new NameValueCollection();Type typeDescription = typeof(DescriptionAttribute);fields = enumType.GetFields();foreach (FieldInfo field in fields){if (field.FieldType.IsEnum){strValue = ((int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null)).ToString();object[] arr = field.GetCustomAttributes(typeDescription, true);if (arr.Length > 0){DescriptionAttribute aa = (DescriptionAttribute)arr[0];strText = aa.Description;}else{strText = field.Name;}nvc.Add(strValue, strText);}}return nvc;}/// <summary>/// 返回 Dic<枚举项,描述>/// </summary>/// <param name="enumType"></param>/// <returns>Dic<枚举项,描述></returns>public static Dictionary<string, string> GetEnumDic(Type enumType){Dictionary<string, string> dic = new Dictionary<string, string>();FieldInfo[] fieldinfos = enumType.GetFields();foreach (FieldInfo field in fieldinfos){if (field.FieldType.IsEnum){Object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);dic.Add(field.Name, ((DescriptionAttribute)objs[0]).Description);}}return dic;}/// <summary>/// 获得某个枚举项的描述/// </summary>/// <param name="value"></param>/// <returns></returns>public static string GetEnumDes(object value){FieldInfo fieldinfo = value.GetType().GetField(value.ToString());Object[] objs = fieldinfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);if (objs == null || objs.Length == 0){return value.ToString();}else{return ((DescriptionAttribute)objs[0]).Description;}}}public enum TimeOfDay{[Description("上午")]Moning = 0,[Description("下午")]Afternoon,[Description("晚上")]Evening,};//public enum TimeOfDays//{//    上午,//    下午,//    晚上//};
}

View Code

或者通过下载文件,直接进行测试。EnumDecriptionGet.rar

参考文章

枚举显示中文问题

转载于:https://www.cnblogs.com/arxive/p/6285718.html

枚举转中文,通过反射方法与描述的方式获取相关推荐

  1. 04.React事件 方法、 React定义方法的几种方式 获取数据 改变数据 执行方法传值...

    2019独角兽企业重金招聘Python工程师标准>>> 一.基本用法 在以类继承的方式定义的组件中,为了能方便地调用当前组件的其他成员方法或属性(如:this.state),通常需要 ...

  2. C#开发笔记之16-如何用C#获取枚举的中文特性信息?

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#开发笔记之16-如何用C#获取枚举的中文特性信息? | .Net中文网. C#开发笔记概述 概述 如何在枚举本身用英文定义的情况下 ...

  3. java工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总

    Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存 ...

  4. 枚举的 7 种使用方法

    枚举是 JDK 1.5 新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春.夏.秋.冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错误码等. 枚 ...

  5. Pandas导出CSV文件中文乱码解决方法

    问题描述: 使用to_csv方法导出CSV文件,文件出现中文乱码 解决方法: 在使用to_csv时在参数中加入参数encoding='utf_8_sig' 关于原理,请参考以下文章: utf-8和ut ...

  6. Zxing中文乱码解决方法

    Zxing中文乱码解决方法总结 尝试过很多方法  最后发现此方法解决的乱码最多....... 在百度搜索二维码图片 经过前2页的测试  除开一张图之外  其余都能扫描出结果 如果大家有更好的解决方法 ...

  7. Java 枚举(enum) 六种常用的方法详解

    JDK1.5引入了新的类型--枚举,在java中虽然枚举只是一个很小的功能,却给我们带来了很大的方便. 首先我们要了解几个概念,enum是没有构造函数的,准确的来说是没有public类型的构造函数, ...

  8. Crt链接linux中文乱码,securecrt怎么显示中文?securecrt中文乱码解决方法

    描述 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. SecureCRT支持SSH,同时支持Telnet和 ...

  9. java枚举怎么遍历,java遍历枚举_java枚举的两种遍历方法

    摘要 腾兴网为您分享:java枚举的两种遍历方法,余额宝,永安期货,易视云3,小睡眠等软件知识,以及幻想三国志4外传,损益表表格,2018微信最新的版本,贺卡,手机mp3格式转换器,cf挂无毒,火炬之 ...

最新文章

  1. android 读写文件权限_flutter 文件下载
  2. android studio 65536错误的解决
  3. 论文浅尝 | WWW2020 - 知识图谱中的实体摘要:算法、评价和应用 (PPT)
  4. php7 字符串,php7 参数、整形及字符串处理机制修改实例分析
  5. linux 添加网关 多张,linux – 更改默认网关,多个NIC
  6. 来,说说什么是运维人的情怀?
  7. 李开复:垂直搜索违背了搜索引擎的发展初衷
  8. 中国上市公司2001-2020年历史股票数据下载(获得方式见网页 http://yanzw.cn )
  9. python写完程序怎么运行
  10. oracle roseha 配置,RoseHA8.5 for Windows Oracle11g配置文档
  11. 计算机3大总线名词解释,计算机名词解释-- 总线.doc
  12. 2022全国职业技能大赛大数据技术与应用赛项赛题环境准备
  13. PHP智云全能API接口源码V1.3
  14. 微信小程序:工具配置 project.config.json
  15. 基于位操作的类CBitBuffer
  16. 软件著作权的好处有哪些?软著含金量高吗?
  17. beyond compare免安装版
  18. Form通过js提交
  19. 什么软件可以识别图片上的文字?分享三个实用的识别软件
  20. [常微分方程的数值解法系列四] 中值法

热门文章

  1. php中的thumb函数,phpcms v9 thumb(缩略图) 函数说明
  2. C语言%.2f四舍五入
  3. C#| 使用String.Format()方法将小数点后的数字四舍五入
  4. 二、织物具备超级防水效果的条件?
  5. 获得jmp esp地址
  6. python36安装numpy_安装numpy
  7. [JS][前端]修改文件input为button样式
  8. ZOJ 3932——Handshakes
  9. 75. 颜色分类 golang
  10. Fire!——两个BFS