Проверка допустимого значения перечисления в VB.NET - PullRequest
1 голос
/ 23 марта 2011

Мой английский может быть не очень хорошим, поэтому извините, если я не вижу смысла.

Мне поручено проверить, что Enum содержит возрастающее значение.

Код выглядитнапример:

Public Enum AccountMessageDescriptor
  AccountInvalid = 1001
  AccountReviewPending=1002
  ...
  InvalidOperationOnAccount=1382
End Enum

Каждое значение Enum также имеет атрибут описания (Custom).Атрибут file и description используется в другом месте ... Похоже, что программисты обновляют перечисления и используют пользовательский атрибут для сообщений справки вместо файлов ресурсов и т. Д. С новым целочисленным значением ...

Например, другоеошибка может быть добавлена ​​как:

NewEnumItem = 1383

Мне нужно убедиться (во время сборки у нас есть пользовательская задача MSBuild, которая выполняет много другой обработки), если перечисление последовательно увеличивается ичто он еще не используется.

Кто-то предложил использовать коллекцию, проверить, существует ли уже значение enum и, если нет, вставить его.

Я думал о том, чтобы просто выполнить итерацию и проверить, является ли текущийзначение равно +1 предыдущему значению (поэтому оно является последовательным и не может быть уже использовано, потому что оно всегда должно быть +1).Это кажется ошибочным или я не понимаю что-то о .NET перечислениях?

Эмми

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Если вы установите первое значение, а затем исключите все последующие значения, они будут инкрементными. например ...

Public Enum testenum
    first = 1001
    second
    third
End Enum

То есть second будет 1002 third будет 1003 и т. Д. И т. Д. *

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

Public Enum testenum
    first = 1001
    second
    third
    fourth = 2000
    fifth
End Enum

Так что в этом примере fourth будет 2000, а fifth будет 2001

0 голосов
/ 23 марта 2011

Чтобы выполнить итерацию по перечислению, вы можете попробовать следующее:

For Each amd As AccountMessageDescriptor In [Enum].GetValues(GetType(AccountMessageDescriptor))
        'Do your thing here
Next

Я не совсем уверен, что в этом случае значения являются последовательными, но быстрый тест может решить это за вас.

Или вы можете сохранить все значения в массиве и проверить, являются ли значения последовательными:

Dim allAMD As AccountMessageDescriptor() = DirectCast([Enum].GetValues(GetType(AccountMessageDescriptor)), AccountMessageDescriptor())

'Loop through array and check with previous
...