VB.Net Enum ToString返回一个未知数字

时间:2009-07-16 14:13:36

标签: vb.net enums

我构建了一个简单的vb.net winforms项目,该项目ping IP地址并记录结果。它在我尝试过的大多数机器上都能正常工作。我使用IPStatus.tostring方法记录ping的状态结果(System.Net.NetworkInformation.IPStatus)。

通常会返回文本结果,例如“Success”或“TimedOut”

昨天,在一台机器上它返回“65”......这不是枚举值之一。我感觉它可能是价值观的组合。我运行了一些测试代码:

Dim status As System.Net.NetworkInformation.IPStatus
status = Net.NetworkInformation.IPStatus.Success
MsgBox(status.ToString)

返回“成功”

而且:

status = Net.NetworkInformation.IPStatus.BadDestination Or Net.NetworkInformation.IPStatus.BadHeader
MsgBox(status.ToString)

返回“11050”

我怀疑我看到的“65”是枚举值的某种组合的结果。有没有什么办法可以改变我的第二个例子中的代码来显示两个值的文本名称?那是......我能在这个变量中看到所有值吗?

5 个答案:

答案 0 :(得分:2)

IPStatus不是Flags枚举,因此以这种方式组合其成员值是不合适的。这是它通过Reflector的定义:

Public Enum IPStatus
    ' Fields
    BadDestination = &H2B0A
    BadHeader = &H2B22
    BadOption = &H2AFF
    BadRoute = &H2B04
    DestinationHostUnreachable = &H2AFB
    DestinationNetworkUnreachable = &H2AFA
    DestinationPortUnreachable = &H2AFD
    DestinationProhibited = &H2AFC
    DestinationProtocolUnreachable = &H2AFC
    DestinationScopeMismatch = &H2B25
    DestinationUnreachable = &H2B20
    HardwareError = &H2B00
    IcmpError = &H2B24
    NoResources = &H2AFE
    PacketTooBig = &H2B01
    ParameterProblem = &H2B07
    SourceQuench = &H2B08
    Success = 0
    TimedOut = &H2B02
    TimeExceeded = &H2B21
    TtlExpired = &H2B05
    TtlReassemblyTimeExceeded = &H2B06
    Unknown = -1
    UnrecognizedNextHeader = &H2B23
End Enum

如何获得65的IPStatus值 - 现在这是真正的问题:)

答案 1 :(得分:1)

尝试使用System.Enum获取值的名称。

在您的示例中,使用: MsgBox(System.Enum.GetName(GetType(Net.NetworkInformation.IPStatus),status))

答案 2 :(得分:0)

除了Success(0)和Unknown(-1)之外,定义的枚举值的范围是11002到11045,因此65不是任何已定义的枚举值的组合。

如果你回来65,你将无法将其解析为字符串。

答案 3 :(得分:0)

该枚举没有标记FlagsAttribute,因此不应该一起使用,因为结果可能会重叠。您最好创建自己的枚举以包含您要查找的值。

答案 4 :(得分:0)

您应该能够使用类似[1]的内容遍历枚举范围,测试当前枚举位是否在值中表示,并将其添加到字符串构建器中。

我觉得很难在这个小文本框中用VB.NET编写一个工作示例,但我相信别人会有责任。

[1] http://damieng.com/blog/2008/04/10/using-linq-to-foreach-over-an-enum-in-c