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 ...
随机推荐
- Treap与fhq_Treap学习笔记
1.普通Treap 通过左右旋来维护堆的性质 左右旋是不改变中序遍历的 #include<algorithm> #include<iostream> #include<c ...
- css 滚动视差 之 水波纹效果
核心属性: background-attachment 这个属性就牛逼了, 它可以定义背景图片是相对视口固定, 还是随着视口滚动, 加上这个属性网页瞬间就从屌丝变成 高大上. 我们来看个例子: htm ...
- 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。
我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...
- (翻译)W3C的Turtle文档
主要翻译如下页面,https://www.w3.org/TR/turtle/,对该页面中Turtle的内容部分进行翻译,希望对使用Turtle的朋友们有所帮助. 1 简介 2 Turtle语言 2.1 ...
- 基于tcp实现远程执行命令
命令执行服务器: # Author : Kelvin # Date : 2019/1/30 20:10 from socket import * import subprocess ip_conf = ...
- 初探机器学习之使用百度AI服务实现图片识别与相似图片
一.百度云AI服务 最近在调研一些云服务平台的AI(人工智能)服务,了解了一下阿里云.腾讯云和百度云.其中,百度云提供了图像识别及图像搜索,而且还细分地提供了相似图片这项服务,比较符合我的需求,且百度 ...
- 《HelloGitHub》第 32 期
公告 新加入了 2 位机器学期的小伙伴负责机器学习专栏.项目的首页增加合作组织一栏,如有开源组织有意合作可以点击联系我. 我们还在路上,不停地前行. <HelloGitHub>第 32 期 ...
- Netty源码—七、内存释放
Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置.所以要理解Netty内存的释放我们得先看下直接内存的释放. Java直接内存释放 我们先来看下直接内存是怎么使用 ...
- Java面向接口编程,低耦合高内聚的设计哲学
接口体现的是一种规范和实现分离的设计哲学,充分利用接口可以极大的降低程序中各个模块之间的耦合,提高系统的可维护性以及可扩展性. 因此,很多的软件架构设计理念都倡导"面向接口编程"而 ...
- 小程序 wepy框架 + iview-weapp的用法
最近在弄wepy的时候在想有没有什么ui比较合适一点的wepy的,也是在网上看了好久发现iview还不错.引用简单,上手超快,组件绚丽!当然,这里还介绍下微信官方建议的框架也是和不错的,有需要的可以看 ...