Это мое перечисление:
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 не работает, как я могу это сделать?
Я предполагаю, что причина, по которой 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))
{
//...
}
Который, очевидно, не идеален, но может помочь вам в этом.
Когда вы не укажете свое перечисление, базовый тип 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-аналоги.
Если ServiceCode
предназначен только для представления значений, которые могут быть преобразованы в значения Byte
, вам может потребоваться изменить базовый тип перечисления:
internal enum ServiceCode : Byte
{
AAA = 0x54, BBB = 0x24, CCC = 0x45
};
Кроме того, вы должны пойти с Джастином
foreach (var value in Enum.GetValues(typeof(ServiceCode))) {
if(tByteItem == value) {
Однако вы можете рассмотреть словарь. Это структура данных, наиболее часто используемая для вашего приложения.