检查byte是否是enum中的值

时间:2014-06-12 13:52:31

标签: c# .net if-statement enums

这是我的枚举:

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子句不起作用,我该怎么做?

4 个答案:

答案 0 :(得分:9)

我猜那个 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))
{
    //...
}

这显然不太理想,但可以帮助你解决问题。

答案 1 :(得分:2)

如果未指定枚举,则枚举的基本类型为整数。通过从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交互式shell上测试)


请注意,这有一些副作用:例如,无法为0x1234成员分配值enum(因为布尔值只能达到0x00和{{1}之间的值}})。


这是因为C#并没有真正“使用”Enum的概念。在内部,枚举按其二进制值存储,如果需要(例如0xff方法),则使用特殊方法。从这个意义上说,C#中的枚举不如java对象那样面向对象。

答案 2 :(得分:0)

如果ServiceCode只是为了表示可以转换为Byte值的值,您可能需要考虑更改枚举的基本类型:

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

或者,您应该使用Justin's answer

答案 3 :(得分:-1)

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

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