C# 检查字节是否为枚举中的值

C# 检查字节是否为枚举中的值,c#,.net,if-statement,enums,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

这是我的枚举:

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

您向它传递的是一个
字节,而不是
int
,这意味着类型检查失败并引发异常。在调用应该解决问题的方法时,您可以尝试将
字节
强制转换为
int

if(Enum.IsDefined(typeof(ServiceCode), (int)tByteItem))
{
    //..
}
您还可以尝试将
Enum
的基础类型更改为byte,这将限制以后的可用值:

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))
{
    //...
}
这显然不太理想,但可能会让你在紧要关头度过难关

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

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

如果不指定枚举,则枚举的基类型为整数。通过从
字节
派生它,这可能会起作用:

internal enum ServiceCode : byte {
    AAA = 0x54,
    BBB = 0x24,
    CCC = 0x45
}
然后,您可以简单地使用:

Enum.IsDefined(typeof(ServiceCode), (byte) 0x54);//true
Enum.IsDefined(typeof(ServiceCode), (byte) 0x84);//false
(在mono的
csharp
交互式外壳上测试)


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



这是因为C#并没有真正“使用”枚举的概念。在内部,枚举按二进制值存储,如有必要(例如
ToString()
method),可使用特殊方法。在这个意义上,C语言中的枚举比java的对象更不面向对象。

如果 Service EcdoC[/Cult>s ]只是表示可以转换为<代码>字节值的值,则可能需要考虑更改枚举的基类型:

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

或者,你应该用

来回答,你的问题是什么?我的if子句不起作用,什么是正确的if子句“不起作用”不是描述问题的好方法此代码抛出一个
ArgumentException
语句,表示“枚举基础类型和对象必须是相同的类型,或者对象必须是字符串。传入的类型为'System.Byte';枚举基础类型为'System.Int32'“在你的问题中加入一些有用的东西。@Damien_不信者-我正准备提问,因为我正在挖掘
Enum.IsDefined
的源代码。好主意。如果Justin猜中了,你的答案除了“最佳实践”之外没有添加太多内容,而“最佳实践”没有得到推理的支持。这种方法的问题是,它在O(n)中运行,n是枚举的元素数。有更快的方法(如二进制搜索或位字符串)来检查成员资格。这是真的,字典可以做到这一点。依赖库发行商提供的经过良好测试和文档化的代码,而不是尝试自己编写代码,这也是一件好事。