我构建了一个简单的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”是枚举值的某种组合的结果。有没有什么办法可以改变我的第二个例子中的代码来显示两个值的文本名称?那是......我能在这个变量中看到所有值吗?
答案 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