VB.NET C#枚举 描述 中文 ComponentModel.Description DescriptionAttribute
本文核心代码来自网上现有的C#代码,稍稍改了一下。
下面例子中定义的枚举,既可以在程序内部使用枚举定义的枚举名或者枚举值,又可以向用户展示枚举的描述值,可以避免使用中文来定义枚举的尴尬以及可能会带来的未知bug。
先来几张不需要说明的图片,能看懂为啥要放这些图片就看,看不懂就怪我咯!~
代码正式开始
Imports System.ComponentModel
Imports System.Runtime.CompilerServicesModule Module1''' <summary>''' 指定筛选模式''' </summary>Public Enum ReleFieldMode<Description("不限")>None<Description("店铺名称")>Title<Description("旺旺名称")>WangWangEnd EnumSub Main()For Each enumItem As ReleFieldMode In System.Enum.GetValues(GetType(ReleFieldMode))Console.WriteLine("枚举名:" & enumItem.ToString() & " 枚举值:" & enumItem & " 描述:" & enumItem.GetDescription)NextConsole.ReadKey()End Sub''' <summary>''' 利用反射获取枚举项的描述''' </summary>''' <param name="enumItem"></param>''' <returns></returns><Extension()>Public Function GetDescription(ByVal enumItem As System.Enum) As StringIf enumItem Is Nothing Then Return String.Empty' #########扩展方法必须要放到模块(Module)中#########' 利用反射获取枚举项的描述Dim enumItemName = enumItem.ToString()Dim enumItemType = enumItem.GetType()Dim fieldinfo = enumItemType.GetField(enumItemName)Dim obj = fieldinfo.GetCustomAttributes(GetType(DescriptionAttribute), False)If obj.Length = 0 ThenReturn String.EmptyElseDim desc = DirectCast(obj.First, DescriptionAttribute)Return desc.DescriptionEnd IfEnd FunctionEnd Module
效果:
另外放一些跟反射相关的图片
测试环境:VS2017 & Win7 64 & .NET Framework4.5.2
20170429更新
修复无法正确获取到多态枚举项的描述的问题
另外,增加一个判断条件,条件为:
枚举必须按照建议定义None和All项,否则一律返回空值
''' <summary>''' 通过反射得到单个枚举项的描述''' 如果获取多个枚举项的描述,需要用Multiple版本,否则无法正确获取''' </summary>''' <param name="enumItem"></param>''' <returns></returns> <Extension()>Public Function GetDescriptionSingle(ByVal enumItem As System.Enum) As StringDim funcResult = String.EmptyDim enumItemType = enumItem.GetType()Dim enumItemName = enumItem.ToString()Dim fieldinfo = enumItemType.GetField(enumItemName)' 如果enumItemName是多态枚举值或者是未找到符合指定要求的字段的对象,将返回nothingIf fieldinfo Is Nothing ThenReturn funcResultEnd IfDim obj = fieldinfo.GetCustomAttributes(GetType(System.ComponentModel.DescriptionAttribute), False)If obj.Length = 0 ThenReturn funcResultElseDim descriptionAttribute = DirectCast(obj.First, System.ComponentModel.DescriptionAttribute)If descriptionAttribute Is Nothing ThenReturn funcResultEnd IffuncResult = descriptionAttribute.DescriptionEnd IfReturn funcResultEnd Function''' <summary>''' 利用反射获取多个枚举项的描述''' 如果获取单个枚举项的描述,用Single版本会更高效''' 如果枚举类没有按照建议的格式来定义,则返回空值''' 建议None定义为0,与All同时被定义到枚举项中''' </summary>''' <param name="enumItems">如果为Nothing,则返回空值</param>''' <returns></returns><Extension()>Public Function GetDescriptionMultiple(ByVal enumItems As System.Enum) As StringIf enumItems Is Nothing Then Return String.Empty' 如果枚举类没有按照建议的格式来定义,则返回空值' 建议None定义为0,与All同时被定义到枚举项中If Not System.Enum.IsDefined(enumItems.GetType, "None") OrElseNot System.Enum.IsDefined(enumItems.GetType, "All") ThenReturn String.EmptyEnd If' 利用反射获取枚举项的描述' 先把enumItems中包含的所有枚举项提取出来到数组中' 如果有更高效的集合类,可以替换数组,因为用数组要不断ReDim PreserveDim enumValues = System.Enum.GetValues(enumItems.GetType())Dim tempEnumItems As System.Enum() = {}Dim itemIndex = 0For Each item As System.Enum In enumValuesIf enumItems.HasFlag(item) ThenReDim Preserve tempEnumItems(itemIndex)tempEnumItems(itemIndex) = itemitemIndex += 1End IfNext' 然后判断数组的长度,如果大于1,那就是enumItems中不包含枚举值None项和All项(通常None定义为0,一般会与All同时被定义到枚举项中)Dim sb As StringBuilder = StringBuilderCache.Acquire(100)Dim splitString = ", "If tempEnumItems.Length > 1 ThenFor Each enumItem In tempEnumItemsIf enumItem.Equals(System.Enum.Parse(enumItems.GetType, "None", True)) OrElseenumItem.Equals(System.Enum.Parse(enumItems.GetType, "All", True)) ThenContinue ForEnd Ifsb.Append(String.Concat(enumItem.GetDescriptionSingle(), splitString))NextElsesb.Append(String.Concat(tempEnumItems(0).GetDescriptionSingle(), splitString))End If' 去掉最后的", " 从后面往前面判断If sb.Length > 0 AndAlsosb.Chars(sb.Length - 2).Equals(splitString.Chars(0)) AndAlsosb.Chars(sb.Length - 1).Equals(splitString.Chars(1)) Thensb.Remove(sb.Length - splitString.Length, splitString.Length)End IfReturn StringBuilderCache.GetStringAndRelease(sb)End Function
噢,上面用到的StringBuilderCache类,你们改成StringBuilder类相应的方法就可以了。
测试枚举定义(含有Flags标识,可以对枚举项进行位运算)
测试结果
VB.NET C#枚举 描述 中文 ComponentModel.Description DescriptionAttribute相关推荐
- 枚举转中文,通过反射方法与描述的方式获取
示例: 有人为了显示中文,这样定义枚举吗? publicenum TimeOfDay { 上午, 下午, 晚上 }; 这样定义,很别扭,特别是在使用的时候, 比如,this.Time = TimeOf ...
- C# .NET Core获取类属性/属性值,是否有属性/属性值,获取实体层描述,枚举描述,枚举英文获取枚举描述[Description(“xxx“)]
属性描述 定义为PropertyInfo的扩展方法 /// <summary> /// 获取属性描述 /// </summary> /// <param name=&qu ...
- 详解C# 枚举高级用法之Description
基础枚举 namespace TestEnum {//声明public enum Name{//默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackCHan那就= 4boo ...
- C# 枚举高级用法之Description
c# 枚举高级用法之 基础枚举 namespace TestEnum {//声明public enum Name{//默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackC ...
- swagger 怎么显示enum_dotnet core swagger filter 隐藏接口和显示枚举描述
dotnet core 2.2开发项目中,常会使用Swagger UI来生成在线Api文档. 某些接口不想放到Swagger中可以这样写Filter: /// /// 隐藏swagger接口特性标识 ...
- 获取枚举值上的Description特性说明
/// <summary> /// 获取枚举值上的Description特性说明 /// </summary> /// <typeparam name="T&q ...
- Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性
CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...
- C#开发笔记之16-如何用C#获取枚举的中文特性信息?
本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#开发笔记之16-如何用C#获取枚举的中文特性信息? | .Net中文网. C#开发笔记概述 概述 如何在枚举本身用英文定义的情况下 ...
- VB 使用SendMessage枚举文件与目录
源码如下: Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (By ...
最新文章
- New LINQ CTP!
- 妈呀!GitChat 发布 1.9 版本更新公告,这个红色简直亮瞎了我的眼...
- Python中使用you-get库批量在线下载bilibili视频的教程
- 绍兴市一男子醉酒驾车还冲上公交车暴打司机
- 【CSS实现Loading遮罩】点击按钮,弹出一个DIV层窗口
- 分布式数据库产品总结
- 网络中间设备路在何方
- php如何写回调函数,php – 如何使用类方法作为回调函数?
- Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】
- 罗永浩带货520鲜花礼盒再翻车:自掏腰包100多万,双倍赔偿
- rename批量修改文件名
- 安装mysql需要配置什么软件_软件配置篇-MySQL下载及安装
- 《手把手教你》系列基础篇之3-python+ selenium自动化测试-驱动浏览器和元素定位大法(详细)
- 5岁自学python编程-25 岁才开始学习python晚吗?40 岁都不晚!
- [转帖] 资本的力量
- matlab扫雷代码及运用解释,MATLAB_百科
- PS颜色校正(Photoshop颜色显示偏色)
- SCI收录期刊——采矿和选矿
- android 手机上浏览网页
- 正交试验设计的基本步骤
热门文章
- 短信平台设计和思路G客短信平台移讯云短信系统
- 图像处理与计算机视觉 基础、经典以及到13年的发展
- mysql数据库恢复策略_数据库系统恢复策略概述
- Vue-Vant—纯JS实现rem与px换算
- Hands on Machine_Learning with Scikit-LearnTensorFlow 资源下载
- Facebook的亚洲战略:没有中国 怎算是连接了世界
- java url转义_url特殊字符转义及解决方法
- 对称加密和非对称加密算法分类,国密算法分类。
- 传说中的处男是这样造就的 [zhuan]
- Lake Counting【POJ2386】