我一直在寻找一种在(vb).NET中枚举String类型的方法,但.NET枚举只接受数字类型值。
我遇到的第一个选择是创建一个我的枚举值字典和我想要返回的字符串。这很有用,但很难维护,因为如果你更改了枚举,你必须记住也要更改字典。
第二种方法是在每个枚举成员上设置字段属性,并使用反射检索它。当然这也起到了作用,也解决了维护问题,但它使用了反射,我一直都认为使用反射应该是最后的选择。
所以我开始思考并且想出了这个:每个ASCII字符都可以表示为十六进制值,并且可以为枚举成员分配十六进制值。
您可以删除属性,将十六进制值分配给枚举成员。然后,当您需要文本值时,将值转换为字节数组并使用System.Text.Encodings.ASCII.GetString(enumMemberBytes)
来获取字符串值。
现在说出经验,我想出的任何事情通常都是有缺陷的,或者说是完全错误的。你们对这种方法有什么看法?有没有理由不这样做?
感谢。
修改
正如David W所指出的,枚举成员值的长度有限,具体取决于基础类型(默认为整数)。所以,是的,我相信我的方法有效,但你只限于ASCII table中的字符,最大长度分别为4或8个字符,使用整数或长整数。
答案 0 :(得分:1)
我发现将枚举的String表示形式动态解析为实际的Enumeration类型的最简单方法是执行以下操作:
Private EnumObject
[Undefined]
ValueA
ValueB
End Enum
dim enumVal as EnumObject = DirectCast([Enum].Parse(GetType(EnumObject), "ValueA"), EnumObject)
这消除了维护字典的需要,并允许您只处理字符串而不是转换为Int或Long。这确实使用了反射,但只要您使用String Parse捕获并处理任何异常,我就没有遇到任何问题。