C# 添加枚举中文资源
在业务开发过程中,添加枚举,在固定枚举值的同时,也需要中文的文案。
如果不想添加语言资源项、添加枚举转语资源项,可以使用特性标记。
属性描述 DescriptionAttribute
先看案例:
public enum WheelchairDataType
{
[Description("前进加速")]
ForwardAdd,
[Description("前进减速")]
ForwardReduce,
[Description("后退加速")]
BackwardAdd,
[Description("后退减速")]
BackwardReduce,
[Description("转弯加速")]
TurningAdd,
[Description("转弯减速")]
TurningReduce
}
static void Main(string[] args)
{
var enumDescriptionDict = GetEnumDescriptionDict(WheelchairDataType.BackwardAdd.GetType());
var enumDescription = enumDescriptionDict[WheelchairDataType.BackwardAdd.ToString()];
Console.WriteLine($"{ WheelchairDataType.BackwardAdd.ToString()}:{enumDescription}");
Console.ReadLine();
}

以上,能够直接获取到枚举的描述值。所以我们可以用Description标记,取代我们经常要对枚举添加的中文注释,既是注释也是一种简便的语言项资源。
DescriptionAttribute继承自Attribute,所以枚举的中文标记值,可以通过反射获取:
/// <summary>
/// 获取枚举/中文字典
/// </summary>
/// <param name="enumType"></param>
/// <returns></returns>
public static Dictionary<string, string> GetEnumDescriptionDict(Type enumType)
{
Dictionary<string, string> dict = new Dictionary<string, string>();
FieldInfo[] fields = enumType.GetFields();
foreach (FieldInfo field in fields)
{
if (field.FieldType.IsEnum)
{
var customAttributes = field.GetCustomAttributes(typeof(DescriptionAttribute), false).ToList();
dict.Add(field.Name, ((DescriptionAttribute)customAttributes[]).Description);
}
} return dict;
}
自定义枚举的描述标记EnumDetailAttribute
如果不想用DescriptionAttribute,或者需要额外的描述信息,可以自定义一个标记。比如:
public class EnumDetailAttribute : Attribute
{
public string Name { get; set; } public int SpecialOrder { get; set; }
}
public enum WheelchairDataType
{
[EnumDetail(Name = "前进加速")]
ForwardAdd,
[EnumDetail(Name = "前进减速")]
ForwardReduce,
[EnumDetail(Name = "后退加速")]
BackwardAdd,
[EnumDetail(Name = "后退减速")]
BackwardReduce,
[EnumDetail(Name = "转弯加速")]
TurningAdd,
[EnumDetail(Name = "转弯减速")]
TurningReduce
}
static void Main(string[] args)
{
Console.WriteLine($"{ WheelchairDataType.BackwardAdd.ToString()}:{ WheelchairDataType.BackwardAdd.GetName()}");
Console.ReadLine();
}

枚举的描述值获取:
public static class EnumExtensions
{
/// <summary>
/// 获取枚举/中文字典
/// </summary>
/// <param name="enumValue"></param>
/// <returns></returns>
public static Dictionary<string, string> GetEnumDict<TEnum>(this TEnum enumValue) where TEnum : struct
{
Type type = enumValue.GetType(); Dictionary<string, string> dict = new Dictionary<string, string>();
FieldInfo[] fields = type.GetFields();
foreach (FieldInfo field in fields)
{
if (field.FieldType.IsEnum)
{
var customAttributes = field.GetCustomAttributes(typeof(EnumDetailAttribute), false).ToList();
dict.Add(field.Name, ((EnumDetailAttribute)customAttributes[]).Name);
}
} return dict;
}
/// <summary>
/// 获取枚举描述特性值
/// </summary>
/// <typeparam name="TEnum"></typeparam>
/// <param name="enumValue">枚举值</param>
/// <returns>枚举值的描述</returns>
public static string GetName<TEnum>(this TEnum enumValue) where TEnum : struct
{
Type type = enumValue.GetType();
//枚举的成员信息
foreach (var memberInfo in type.GetMembers())
{
if (memberInfo.Name != enumValue.ToString()) continue;
//获取自定义标记
foreach (Attribute attr in memberInfo.GetCustomAttributes(typeof(EnumDetailAttribute), false))
{
var attribute = attr as EnumDetailAttribute;
if (attribute == null) continue;
return attribute.Name;
}
}
return string.Empty;
}
}
C# 添加枚举中文资源的更多相关文章
- TensorFlow 中文资源全集,官方网站,安装教程,入门教程,实战项目,学习路径。
Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...
- Newtonsoft.Json高级用法之枚举中文转义
最近看博客园中 焰尾迭的两篇关于"Newtonsoft.Json高级用法"的文章受到了很多人的评论,一度登入到头条推荐. 今天我就不再重复焰尾迭博文中的一些提过的Newtonsof ...
- 【转】利用Eclipse编辑中文资源文件(application_zh_CN.properties )
既然生为中国人,就没有什么好抱怨的了,遇到编码的问题,那只有解决它了. 如果经常使用Struts,并做过国际化操作的人来说,对于中文资源文件的处理应该不会感到陌生的.比如下面两个文件,一个是英文的,一 ...
- TensorFlow 中文资源精选,官方网站,安装教程,入门教程,实战项目,学习路径。
Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...
- Redis最有用的中文资源,你值得拥有
只是为了记录资源地址,最好直接访问doc.redisfans.com更美观 Redis 命令参考 本文档是 Redis Command Reference 和 Redis Documentation ...
- python中文资源大全
Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...
- ASP.NET Core中结合枚举和资源文件显示列表
模型类的某些属性以枚举形式出现,我们希望在打开编辑表单时在选择列表中显示枚举值.有时我们想要枚举元素名称,但有时我们想要使用自定义名称甚至翻译. 这个例子演示了如何获取枚举元素名称以选择ASP.NET ...
- 对本地Solr服务器添加IK中文分词器实现全文检索功能
在上一篇随笔中我们提到schema.xml中<field/>元素标签的配置,该标签中有四个属性,分别是name.type.indexed与stored,这篇随笔将讲述通过设置type属性的 ...
- springboot 1.5.2 thymeleaf 添加templates 静态资源访问路径
从velocity 模板切换到thymeleaf 后, 默认模板位置为templates , 有时候静态资源方在该目录下会出现访问404错误 解决办法: application.properties ...
随机推荐
- WeTest----如何查看Wetest生成测试报告?
在前一篇文章中主要介绍了手机中如何开始进行WeTest测试,此篇文章将总结测试报告的查看,这里很简单啦,一切的测试结果wetest都将自动生成,值得注意的是,新注册的用户默认每项测试次数为5,所以请珍 ...
- 干货,一文带你超详细了解Session的原理及应用
session 简介 session 是我们 jsp 九大隐含对象的一个对象. session 称作域对象,他的作用是保存一些信息,而 session 这个域对象是一次会话期间使用同一个对象.所以这个 ...
- 菜鸟如何反转到资深Web安全工程师
90后理工男,计算机专业,毕业于985院校,从事Web安全工作,两年多的时间里先后跳槽3家公司,跳槽理由主要有以下几点:加班多.薪资低.工作内容枯燥,不想安于现状,寄希望于通过跳槽找到一个“钱多.活少 ...
- ASP.NET Core 实战:基于 Jwt Token 的权限控制全揭露
一.前言 在涉及到后端项目的开发中,如何实现对于用户权限的管控是需要我们首先考虑的,在实际开发过程中,我们可能会运用一些已经成熟的解决方案帮助我们实现这一功能,而在 Grapefruit.VuCore ...
- 两个月的Java实习结束,继续努力
前言 只有光头才能变强 2018年8月30日,今天我辞职了.在6月25号入职,到现在也有两个月时间了. 感受: 第一天是期待的:第一次将项目拉到本地上看的时候,代码很多,有非常多的模块,模块下又有da ...
- 快速入门:弄懂Kafka的消息流转过程
大家都知道 Kafka 是一个非常牛逼的消息队列框架,阿里的 RocketMQ 也是在 Kafka 的基础上进行改进的.对于初学者来说,一开始面对这么一个庞然大物会不知道怎么入手.那么这篇文章就带你先 ...
- 史诗级Java资源大全中文版
本文来自GitHub 上 Awesome - java 系列的资源整理.awesome-java 就是 akullpp 发起维护的 Java 资源列表,内容包括:构建工具.数据库.框架.模板.安全.代 ...
- 微信小程序echarts层级太高
项目中因为需求,底部的tab导航栏是自己写的,在开发者工具中一切正常:但是在真机上页面滑动时,echarts的层级比tab高,调过两者的z-index后仍然如此. 经过查找后发现cover-view和 ...
- ArcGIS JS 3.x使用webgl绘制热力图
ArcGIS Js Api 3.x 热力图在数据量达到三万左右的时候,绘制速度不尽人意,数据量再大些,缩放时候就会很卡,非常影响客户体验. 参考了一下网上webgl热力图,能达到更流畅 ...
- ArcGIS JavaScript API4.8 底图选择的几种方案
创建一个HTML页面,引入ArcGIS JavaScript API,在<body>标签内创建一个div并添加ID值,在<head>标签内设置样式<style>,在 ...