Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 将字符串枚举为字节?_Vb.net_Enums - Fatal编程技术网

Vb.net 将字符串枚举为字节?

Vb.net 将字符串枚举为字节?,vb.net,enums,Vb.net,Enums,我正在寻找一种在(vb).NET中枚举字符串类型的方法,但是.NET枚举只接受数字类型值 我遇到的第一个选择是创建一个包含枚举值和要返回的字符串的字典。这很有效,但很难维护,因为如果更改枚举,则必须记住同时更改字典 第二种选择是在每个枚举成员上设置字段属性,并使用反射检索它。当然,这也很好地解决了维护问题,但它使用了反射,我一直在读到使用反射应该是最后的选择 所以我开始思考,我想到了这个:每个ASCII字符都可以表示为十六进制值,您可以将十六进制值分配给枚举成员。 您可以去掉属性,将十六进制值分

我正在寻找一种在(vb).NET中枚举字符串类型的方法,但是.NET枚举只接受数字类型值

我遇到的第一个选择是创建一个包含枚举值和要返回的字符串的字典。这很有效,但很难维护,因为如果更改枚举,则必须记住同时更改字典

第二种选择是在每个枚举成员上设置字段属性,并使用反射检索它。当然,这也很好地解决了维护问题,但它使用了反射,我一直在读到使用反射应该是最后的选择

所以我开始思考,我想到了这个:每个ASCII字符都可以表示为十六进制值,您可以将十六进制值分配给枚举成员。 您可以去掉属性,将十六进制值分配给枚举成员。然后,当需要文本值时,将该值转换为字节数组,并使用
System.text.Encodings.ASCII.GetString(enumMemberBytes)
获取字符串值

根据我的经验,我提出的任何东西通常要么有缺陷,要么完全错了。你们觉得这个方法怎么样?有什么理由不这样做吗

谢谢

编辑


正如David W所指出的,枚举成员值的长度是有限的,这取决于基础类型(默认情况下为整数)。是的,我相信我的方法是有效的,但您仅限于中的字符,最大长度为4或8个字符,分别使用整数或long。

我发现,将枚举的字符串表示动态解析为实际枚举类型的最简单方法是执行以下操作:

Private EnumObject
     [Undefined]
     ValueA
     ValueB
End Enum

dim enumVal as EnumObject = DirectCast([Enum].Parse(GetType(EnumObject), "ValueA"), EnumObject)

这样就无需维护字典,只需处理字符串,而无需转换为Int或Long。这确实使用了反射,但只要您捕获并处理字符串解析的任何异常,我就不会遇到任何问题。

我发现的将枚举的字符串表示动态解析为实际枚举类型的最简单方法是执行以下操作:

Private EnumObject
     [Undefined]
     ValueA
     ValueB
End Enum

dim enumVal as EnumObject = DirectCast([Enum].Parse(GetType(EnumObject), "ValueA"), EnumObject)


这样就无需维护字典,只需处理字符串,而无需转换为Int或Long。这确实使用了反射,但只要您捕获并处理字符串解析的任何异常,我就没有遇到任何问题。

也许我没有正确理解您的问题,但枚举类型只是暗示int类型。在您的场景中,假设int的长度为四字节(在32位平台上),您将被限制为四个字符(ASCII编码)的枚举“字符串”。现在,尽管如此,请记住,您可以在枚举值中声明文本(符号)名称,而这些名称可以,当你需要的时候,随时可以转换成字符串。啊,我刚刚遇到了这个问题。将基础类型更改为Long会将最大长度加倍为8个字符,但这仍然不足以满足我的要求。您正在尝试如何枚举枚举吗@volody不,我只是想给我的枚举成员分配文本值,如果您对8个字符的上限感到满意,并且仅限于ASCII表中的字符(意味着没有重音符号或有趣的符号),这确实可能是我描述的方式。也许我没有正确理解您的问题,但是枚举类型只意味着int类型。在您的场景中,假设int的长度为四字节(在32位平台上),您将被限制为四个字符(ASCII编码)的枚举“字符串”。现在,尽管如此,请记住,您可以在枚举值中声明文本(符号)名称,而这些名称可以,当你需要的时候,随时可以转换成字符串。啊,我刚刚遇到了这个问题。将基础类型更改为Long会将最大长度加倍为8个字符,但这仍然不足以满足我的要求。您正在尝试如何枚举枚举吗@volody不,我只是想给我的枚举成员分配文本值,如果你对8个字符的上限感到满意的话,这确实是可能的,仅限于ASCII表中的字符(意味着没有重音符号或有趣的符号)。很棒的东西,但这不是问题所在。澄清一下:我想要一个字符串枚举,用于将强类型枚举值作为参数的方法,而不是使用非强类型的常量。最接近实际字符串枚举的方法是将所需的值设置为成员名,并使用其.ToString方法。但是这样做的感觉不太对劲。或者换句话说:我需要用另一种方式来做。我收到ValueA或ValueB,我需要返回“ValueA”或“ValueB”。当然,除了这些值与枚举名有很大的不同之外,所以调用ToString不会减少它,除非我更改了实际的枚举名(参见前面的注释)。我明白了。因此,您希望得到一种友好的枚举字符串表示形式,而不是.ToString?这里有一个链接可能会有所帮助:这篇文章介绍了我在问题“设置字段属性”中已经介绍过的内容。他的代码甚至没有实现一种缓存形式来处理后续的请求,而不会像使用反射那样影响性能。这是很棒的东西,但这不是问题所在。澄清一下:我想要一个字符串枚举,用于将强类型枚举值作为参数的方法,而不是使用非强类型的常量。最接近实际字符串枚举的方法是将所需的值设置为成员名,并使用其.ToString方法。但是这样做的感觉不太对劲。或者换句话说:我需要用另一种方式来做。我收到ValueA或ValueB,我需要返回“ValueA”或“ValueB”。除了