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

示例:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java语言最新实用案例教程_Java 语言实用案例教程

基本信息书名:Java 语言实用案例教程出版价格&#xff1a;48元作者:常玉慧, 王秀梅出版社&#xff1a;科学出版社出版日期&#xff1a;2016-10-1ISBN&#xff1a;9787030497383字数&#xff1a;387000页码&#xff1a;235版次&#xff1a;版装帧&#xff1a;平装开本&#xff1…

(转)Java随机数

1 随机数的三种产生方式 本章先讲解Java随机数的几种产生方式&#xff0c;然后通过示例对其进行演示。 广义上讲&#xff0c;Java中的随机数的有三种产生方式&#xff1a; (01). 通过System.currentTimeMillis()来获取一个当前时间毫秒数的long型数字。(02). 通过Math.random()…

leetcode105. 从前序与中序遍历序列构造二叉树(递归)

根据一棵树的前序遍历与中序遍历构造二叉树。注意: 你可以假设树中没有重复的元素。例如&#xff0c;给出前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a;3/ \9 20/ \15 7代码 /*** Definition for a binary tree node.*…

途虎养车三个创始人_3个来自非常规创始人的获奖技术和产品见解

途虎养车三个创始人by Henry通过亨利 3个来自非常规创始人的获奖技术和产品见解 (3 Winning Technology & Product Insights from WeChat’s unconventional founder) Intro: The writer is a current PMLinkedIn. Formerly he worked as a growth engineer Facebook. he …

Powershell-创建Module

1.找到默认module路径&#xff0c;ISE启动时自动加载默认领下的Module代码。 $env:PSModulePath 2.在其中一个默认路径下创建个文件夹&#xff0c;在文件夹下创建一个.psm1后缀文件&#xff0c;注意文件夹名字与文件名一样。 3.在.psm1文件中写入函数代码。 4.重启ISE自动加载m…

android是java_为什么大家都用JAVA写android程序

您好&#xff0c;1、原始类型&#xff1a;v void 只能用于返回值类型Z booleanB byteS shortC charI intJ long(64位)F floatD double(64位)对象类型&#xff1a;Lpackage/name/ObjectName相当于java中的package.name.ObjectName解释如下&#xff1a;L&#xff1a;表示这是一个…

preserve log什么意思_一些有意思的JavaScript代码片段

Javascript是一门很灵活的语言&#xff0c;我们可以使用它动态地实现各种各样的功能。但是动态带来便利的同时&#xff0c;也存在一些令人费解的行为&#xff0c;稍不注意就会进入误区一个接着一个的坑。虽然我使用JavaScript的时间还不算长&#xff0c;也是遇到了一些有意思的…

快速排序——Java

快排的思想想必大家都懂&#xff0c;前后两个指针&#xff0c;向中间靠拢。我这个partition函数能保证所有相同的数都被比较一次&#xff0c;靠拢在一起。 代码&#xff1a; public class Main { public static int[] partition1(int[] arr, int begin, int end, int pivotVal…

预处理器sass_Sass — Web的预处理器装饰

预处理器sass美学的重要性&#xff0c;其影响以及实现这一目标的工具。 (Importance of aesthetics, its impact, and tool to achieve it.) I remember as a child, every time I’d walk up to a bakery, I’d choose the pastries with the most beautiful toppings. Only a…

leetcode971. 翻转二叉树以匹配先序遍历(dfs)

给定一个有 N 个节点的二叉树&#xff0c;每个节点都有一个不同于其他节点且处于 {1, …, N} 中的值。 通过交换节点的左子节点和右子节点&#xff0c;可以翻转该二叉树中的节点。 考虑从根节点开始的先序遍历报告的 N 值序列。将这一 N 值序列称为树的行程。 &#xff08;回…

【BZOJ3932】[CQOI2015]任务查询系统 主席树

【BZOJ3932】[CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统&#xff0c;而你被安排完成其中的查询部分。超级计算机中的任务用三元组(Si,Ei,Pi)描述&#xff0c;(Si,Ei,Pi)表示任务从第Si秒开始&#xff0c;在第Ei秒后结束&…

冲刺第一天

任务板 未开始 进行中已完成 刘晓杰&#xff1a;找回密码界面 页面风格优化 刘晓杰&#xff1a;滑动欢迎界面/加载界面 预计时间&#xff1a;5.5h 冯晨&#xff1a;找回密码功能 发布动态界面 冯晨&#xff…

杭电1003 java_杭电ACM1003题怎么理解?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼http://acm.hdu.edu.cn/showproblem.php?pid1003Max SumTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 99208 Accepted Submission(s): 22835Problem DescriptionGiven…

ubtunu打开firefox_如何在Firefox(在Lubuntu中)中打开“apt”链接?

问题描述Ask Ubuntu上的许多答案都直接指向在Ubuntu软件中心中在Xubuntu中打开的this之类的链接。在Lubuntu中&#xff0c;我收到此错误消息&#xff1a;在Firefox-Preferences中&#xff0c;应用程序看不到类似于apt的东西来关联程序等。在Chromium或Opera中打开相同的链接&am…

web api json_有关使用JSON Web令牌保护无服务器API的速成班

web api jsonWhat a mouthful of a title. Wouldn’t you agree? In this walkthrough you’ll learn about securing your Serverless endpoints with JSON web tokens.这么大的头衔。 你不同意吗&#xff1f; 在本演练中&#xff0c;您将学习如何使用JSON Web令牌保护无服务…

【python之路14】发送邮件实例

1、发邮件的代码 from email.mime.text import MIMETextfrom email.utils import formataddrimport smtplibmsg MIMEText(邮件内容,plain,utf-8)msg[from] formataddr([sunshuhai,25193qq.com])msg[to] formataddr([走人,252222222qq.com])msg[Subject] 主题server smtpli…

苹果内存取证工具volafox

2019独角兽企业重金招聘Python工程师标准>>> 苹果内存取证工具volafox volafox是一款针对苹果内存取证的专用工具。该工具使用Python语言编写。该工具内置了overlay data数据&#xff0c;用户可以直接分析苹果10.6-10.11的各种内存镜像文件。该工具提供28个子命令&a…

leetcode513. 找树左下角的值(dfs)

给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 代码 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ class Solution {int maxL0,maxN0;pu…

Flutter实战视频-移动电商-45.详细页_说明区域UI编写

45.详细页_说明区域UI编写 pages/details_page/details_expain.dart 详情页面引用组件 效果展示&#xff1a; 最终代码&#xff1a; import package:flutter/material.dart; import package:flutter_screenutil/flutter_screenutil.dart;class DetailsExplain extends Stateles…

win10java怎么运行_win10系统电脑怎样才可以运行Java开发

展开全部安装jdk&#xff0c;jdk下载地址&#xff1a;网页链接 根据电脑系统选择对应版本。32/64安装时候&#xff0c;安装路径可以默认&#xff0c;也可以自己指定。我个人喜欢安装到非系统盘&#xff0c;比如D盘。jdk安装后&#xff0c;会弹出jre安装界面&#xff0c;路径同样…