检查字节是否是枚举中的值
本文关键字:枚举 字节 是否是 检查 | 更新日期: 2023-09-27 18:08:24
这是我的枚举:
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
的基本类型匹配。在这种情况下,由于您没有指定,所以基本类型是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))
{
//...
}
这显然不太理想,但可能会让你在紧要关头度过难关。
如果未指定枚举,则枚举的基类型为整数。通过从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
之间的值(。
这是因为C#并没有真正"使用"枚举的概念。在内部,枚举按其二进制值存储,如有必要,可使用特殊方法(例如ToString()
方法(。从这个意义上说,C#中的枚举与java中的枚举相比没有那么面向对象。
如果ServiceCode
只是用来表示可以转换为Byte
值的值,您可能需要考虑更改枚举的基本类型:
internal enum ServiceCode : Byte
{
AAA = 0x54, BBB = 0x24, CCC = 0x45
};
或者,您应该使用Justin的答案
foreach (var value in Enum.GetValues(typeof(ServiceCode))) {
if(tByteItem == value) {
但是,您可能需要考虑使用字典。这是应用程序最常用的数据结构。