本文核心代码来自网上现有的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相关推荐

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

    示例: 有人为了显示中文,这样定义枚举吗? publicenum TimeOfDay { 上午, 下午, 晚上 }; 这样定义,很别扭,特别是在使用的时候, 比如,this.Time = TimeOf ...

  2. C# .NET Core获取类属性/属性值,是否有属性/属性值,获取实体层描述,枚举描述,枚举英文获取枚举描述[Description(“xxx“)]

    属性描述 定义为PropertyInfo的扩展方法 /// <summary> /// 获取属性描述 /// </summary> /// <param name=&qu ...

  3. 详解C# 枚举高级用法之Description

    基础枚举 namespace TestEnum {//声明public enum Name{//默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackCHan那就= 4boo ...

  4. C# 枚举高级用法之Description

    c# 枚举高级用法之 基础枚举 namespace TestEnum {//声明public enum Name{//默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackC ...

  5. swagger 怎么显示enum_dotnet core swagger filter 隐藏接口和显示枚举描述

    dotnet core 2.2开发项目中,常会使用Swagger UI来生成在线Api文档. 某些接口不想放到Swagger中可以这样写Filter: /// /// 隐藏swagger接口特性标识 ...

  6. 获取枚举值上的Description特性说明

    /// <summary> /// 获取枚举值上的Description特性说明 /// </summary> /// <typeparam name="T&q ...

  7. Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性

    CSDN 课程推荐:<Python 数据分析与挖掘>,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务.曾与联想.亨氏.网 ...

  8. C#开发笔记之16-如何用C#获取枚举的中文特性信息?

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#开发笔记之16-如何用C#获取枚举的中文特性信息? | .Net中文网. C#开发笔记概述 概述 如何在枚举本身用英文定义的情况下 ...

  9. VB 使用SendMessage枚举文件与目录

    源码如下: Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (By ...

最新文章

  1. New LINQ CTP!
  2. 妈呀!GitChat 发布 1.9 版本更新公告,这个红色简直亮瞎了我的眼...
  3. Python中使用you-get库批量在线下载bilibili视频的教程
  4. 绍兴市一男子醉酒驾车还冲上公交车暴打司机
  5. 【CSS实现Loading遮罩】点击按钮,弹出一个DIV层窗口
  6. 分布式数据库产品总结
  7. 网络中间设备路在何方
  8. php如何写回调函数,php – 如何使用类方法作为回调函数?
  9. Spring Cloud构建微服务架构:分布式服务跟踪(入门)【Dalston版】
  10. 罗永浩带货520鲜花礼盒再翻车:自掏腰包100多万,双倍赔偿
  11. rename批量修改文件名
  12. 安装mysql需要配置什么软件_软件配置篇-MySQL下载及安装
  13. 《手把手教你》系列基础篇之3-python+ selenium自动化测试-驱动浏览器和元素定位大法(详细)
  14. 5岁自学python编程-25 岁才开始学习python晚吗?40 岁都不晚!
  15. [转帖] 资本的力量
  16. matlab扫雷代码及运用解释,MATLAB_百科
  17. PS颜色校正(Photoshop颜色显示偏色)
  18. SCI收录期刊——采矿和选矿
  19. android 手机上浏览网页
  20. 正交试验设计的基本步骤

热门文章

  1. 短信平台设计和思路G客短信平台移讯云短信系统
  2. 图像处理与计算机视觉 基础、经典以及到13年的发展
  3. mysql数据库恢复策略_数据库系统恢复策略概述
  4. Vue-Vant—纯JS实现rem与px换算
  5. Hands on Machine_Learning with Scikit-LearnTensorFlow 资源下载
  6. Facebook的亚洲战略:没有中国 怎算是连接了世界
  7. java url转义_url特殊字符转义及解决方法
  8. 对称加密和非对称加密算法分类,国密算法分类。
  9. 传说中的处男是这样造就的 [zhuan]
  10. Lake Counting【POJ2386】