检查字节是否是枚举中的值

本文关键字:枚举 字节 是否是 检查 | 更新日期: 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成员(因为布尔值只能达到0x000xff之间的值(。


这是因为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) {

但是,您可能需要考虑使用字典。这是应用程序最常用的数据结构。