Проверьте, является ли байт значением из enum

1

Это мое перечисление:

internal enum ServiceCode
{
    AAA = 0x54, BBB = 0x24, CCC = 0x45
};

В моем методе, я хочу проверить, если номер байта в моем перечислении:

Byte tByteItem;

// tByteItem converted to decimal for example: 0x54 -> 84

// now I want to check, if 84 (=0x54) is in my enum
// it should be true, because AAA = 0x54 = 84
if (Enum.IsDefined(typeof(ServiceCode), tByteItem))
{
    // ...          
}

Мое предложение if не работает, как я могу это сделать?

  • 3
    А какой у тебя вопрос?
  • 0
    Мое предложение if не работает, что является правильным предложением if
Показать ещё 2 комментария
Теги:
if-statement
enums

4 ответа

9
Лучший ответ

Я предполагаю, что причина, по которой Enum.IsDefined не работает, заключается в том, что вы выполняете проверку типа, чтобы гарантировать, что Enum.IsDefined вами значение соответствует базовому типу Enum. В этом случае, поскольку вы не указали, базовый тип - int.

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

if(Enum.IsDefined(typeof(ServiceCode), (int)tByteItem))
{
    //..
}

Вы также можете попробовать изменить базовый тип Enum на байт, который ограничил бы доступные значения позже:

internal enum ServiceCode : byte
{
    AAA = 0x54,
    BBB = 0x24,
    CCC = 0x45
}

Или, если это все еще не работает, вы можете попробовать альтернативный метод. Что-то вроде:

// Get all possible values and see if they contain the byte value.
if(Enum.GetValues(typeof(ServiceCode).Contains(tByteItem))
{
    //...
}

Который, очевидно, не идеален, но может помочь вам в этом.

2

Когда вы не укажете свое перечисление, базовый тип Enum является целым числом. Получив его из byte, это может сработать:

internal enum ServiceCode : byte {
    AAA = 0x54,
    BBB = 0x24,
    CCC = 0x45
}

Тогда вы можете просто использовать:

Enum.IsDefined(typeof(ServiceCode), (byte) 0x54);//true
Enum.IsDefined(typeof(ServiceCode), (byte) 0x84);//false

(тестируется на интерактивной оболочке csharp моно)


Обратите внимание, что это имеет некоторые побочные эффекты: например, невозможно назначить значение 0x1234 enum (поскольку логическое значение может достигать только значений от 0x00 до 0xff).


Это связано с тем, что С# на самом деле не использует понятие Enum. Внутренне перечисления хранятся по их двоичному значению, и при необходимости (например, метод ToString()) используются специальные методы. В этом смысле перечисления в С# менее объектно-ориентированы, чем их Java-аналоги.

0

Если ServiceCode предназначен только для представления значений, которые могут быть преобразованы в значения Byte, вам может потребоваться изменить базовый тип перечисления:

internal enum ServiceCode : Byte
{
    AAA = 0x54, BBB = 0x24, CCC = 0x45
};

Кроме того, вы должны пойти с Джастином

-2
foreach (var value in Enum.GetValues(typeof(ServiceCode))) {
    if(tByteItem == value) {

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

  • 0
    Если Джастин прибил его, ваш ответ не добавляет ничего, кроме «лучшей практики», которая не подкреплена аргументами.
  • 0
    Проблема этого подхода заключается в том, что он работает в O (n) с n количеством элементов перечисления. Существуют более быстрые методы (например, двоичный поиск или битовая строка) для проверки членства.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню