700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > VB.NET C#枚举 描述 中文 ComponentModel.Description DescriptionAttribute

VB.NET C#枚举 描述 中文 ComponentModel.Description DescriptionAttribute

时间:2020-12-18 02:15:20

相关推荐

VB.NET C#枚举 描述 中文 ComponentModel.Description DescriptionAttribute

本文核心代码来自网上现有的C#代码,稍稍改了一下。

下面例子中定义的枚举,既可以在程序内部使用枚举定义的枚举名或者枚举值,又可以向用户展示枚举的描述值,可以避免使用中文来定义枚举的尴尬以及可能会带来的未知bug。

先来几张不需要说明的图片,能看懂为啥要放这些图片就看,看不懂就怪我咯!~

代码正式开始

Imports ponentModelImports pilerServicesModule 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

效果:

另外放一些跟反射相关的图片

测试环境:VS & Win7 64 & .NET Framework4.5.2

0429更新

修复无法正确获取到多态枚举项的描述的问题

另外,增加一个判断条件,条件为:

枚举必须按照建议定义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(ponentModel.DescriptionAttribute), False)If obj.Length = 0 ThenReturn funcResultElseDim descriptionAttribute = DirectCast(obj.First, ponentModel.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标识,可以对枚举项进行位运算)

测试结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。