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 ...
随机推荐
- QTTabBar
出处:https://www.mokeyjay.com/archives/1811
- appium---【已解决】【Mac】如何查看java的安装路径及JAVA_HOME环境变量的配置
报错截图:根据提示可以看出,JAVA_HOME的环境变量配置错误,需要重新配置. 1.查看Java版本 打开mac电脑,查看java版本,打开终端Terminal,通过命令查看java的版本 Luck ...
- mysql 使用Navicat Lite如何打开‘查询编辑器’,使用sql语句对表进行操作!
今天第一次使用mysql,尽然连查询编辑器都找不到,研究了半天,询问了下大牛,才搞出来,准备写下来,后面方面忘记了有查找的地方,哈哈哈~~ 如何打开"查询编辑器",使用sql语句进 ...
- 关于String类型中==和equals的区别。
"=="操作符的作用 1.用于基本数据类型的比较,比较的是值. 2.用于比较对象,判断对象的引用是否指向堆内存的同一块地址. equals的作用 用于比较两个对象的内容是否相同 代 ...
- safari 浏览器 input textarea select 等不能响应用户输入
解决办法 -webkit-user-select:auto; /*webkit浏览器*/ user-select:auto; -o-user-select:auto; -ms-user-select: ...
- Adobe Photoshop CC 2019 for Mac v20.0.4 中文版安装教程
全新Adobe Photoshop CC 2019 mac特别版终于上线了,简称ps cc 2019,Adobe Photoshop CC 2019 for Mac v20.0.4 中文版安装教程分享 ...
- object类和内部类
1.Object object类是所有类的根类(父类). 如果一个类没有显示继承另外一个类,那么该类一定继承于object类. toString()返回对象字符串的的形式. public class ...
- 微服务架构 - 解决Docker-Compose服务编排启动顺序问题
基于Docker Compose进行服务编排时,一定碰到服务启动顺序的问题,例如:B服务启动之前,A服务要已经启动并且可以正常对外服务. 这个启动顺序的问题,Docker Compose本身它是无法解 ...
- asp.net core系列 42 Web 应用 分部视图
一.分部视图 对于MVC 视图和 Razor Pages 页面,都有分部视图功能.通常将 MVC 视图和 Razor Pages 页面统称为“标记文件”,下面会常提到该名词.使用分部视图的优势包括:( ...
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...