VB.Net Enum ToString возвращает неизвестное число - PullRequest
2 голосов
/ 16 июля 2009

Я создал простой проект winforms vb.net, который пингует IP-адреса и регистрирует результаты. Он отлично работает на большинстве машин, на которых я пробовал. Я регистрирую результат проверки статуса (System.Net.NetworkInformation.IPStatus) с помощью метода IPStatus.tostring.

Обычно это возвращает текстовый результат, такой как «Успех» или «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", который я увидел, был результатом некоторой комбинации значений enum. Можно ли как-нибудь изменить код во втором примере, чтобы отобразить текстовые имена обоих значений? То есть ... каким-либо образом я вижу ВСЕ значения в этой переменной?

Ответы [ 5 ]

2 голосов
/ 16 июля 2009

IPStatus НЕ является перечислением Flags, поэтому нецелесообразно объединять значения его членов таким образом. Это его определение через отражатель:

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

Как вы получаете IPStatus значение 65 - теперь это настоящий вопрос:)

1 голос
/ 16 июля 2009

Попробуйте использовать System.Enum, чтобы получить имя значения.

В вашем примере используйте: MsgBox (System.Enum.GetName (GetType (Net.NetworkInformation.IPStatus), статус))

0 голосов
/ 16 июля 2009

Вы должны быть в состоянии перебрать диапазон перечисления, используя что-то вроде [1], проверить, представлен ли текущий бит перечисления в значении и добавить его в построитель строк.

Мне трудно написать рабочий образец в VB.NET в этом небольшом текстовом поле, но я уверен, что кто-то другой обяжет.

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

0 голосов
/ 16 июля 2009

Это перечисление не помечено атрибутом FlagsAttribute и поэтому не должно быть или должно быть вместе, потому что результат может перекрываться. Вам лучше создать собственное перечисление, содержащее искомые значения.

0 голосов
/ 16 июля 2009

Похоже, кроме Success (0) и Unknown (-1), определенные значения перечисления находятся в диапазоне от 11002 до 11045, поэтому 65 не является комбинацией каких-либо из определенных значений перечисления.

Если вы получите 65 обратно, вы не сможете преобразовать это в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...