根据枚举值获取枚举名称

6

我声明了以下枚举:

public enum AfpRecordId
{
    BRG = 0xD3A8C6,
    ERG = 0xD3A9C6
}

我希望您能从其值中检索出枚举对象:
private AfpRecordId GetAfpRecordId(byte[] data)
{
    ...                    
}

调用示例:

byte[] tempData = new byte { 0xD3, 0xA8, 0xC6 };
AfpRecordId tempId = GetAfpRecordId(tempData);

//tempId should be equals to AfpRecordId.BRG

如果使用linq或者lambda表达式能够提供更好或者相等性能的话,我也希望使用它们。


可能是获取已知值的枚举名称的重复问题。 - Heinzi
3个回答

9

简单:

  • 将字节数组转换为int(可以手动转换,也可以创建一个四字节数组并使用BitConverter.ToInt32
  • int强制转换为AfpRecordId
  • 如果需要获取名称,则在结果上调用ToString(您的主题行建议获取名称,但方法签名只谈论值)

例如:

private static AfpRecordId GetAfpRecordId(byte[] data)
{
    // Alternatively, switch on data.Length and hard-code the conversion
    // for lengths 1, 2, 3, 4 and throw an exception otherwise...
    int value = 0;
    foreach (byte b in data)
    {
        value = (value << 8) | b;
    }
    return (AfpRecordId) value;
}

您可以使用 Enum.IsDefined 来检查给定的数据是否实际上是一个 有效的 ID。

至于性能 - 在寻找更快的方法之前,请先检查是否有一些简单的方法可以给您足够好的性能。


我是否被迫将字节数组转换为整数?如果我理解正确,值“BRG = 0xD3A8C6”不被识别为byte[]吗? - Duncan_McCloud
我认为他实际上不是在寻找一个字符串(我最初也是这样认为的)。如果您查看其样板方法的返回类型,它将返回枚举值。 - Rune FS
3
@Duncan_McCloud说:“确实,0xd3a8c6是一个int字面量,不是一个字节数组。虽然可能有其他将字节数组转换为整数的方法,但它们实际上会归结为类似的操作,并且更加复杂。这段代码应该非常快速,而且简单易懂 - 你对它有什么不满意的地方吗?” - Jon Skeet
我喜欢它。我只是想完全理解它的工作原理 :)。午饭后我会开始使用它。谢谢 :) - Duncan_McCloud
1
@Duncan_McCloud:基本上,枚举是从数字到名称的映射。您枚举中的数字是“int”值,因此您需要将字节数组转换为“int”以获取正确的数字。 - Jon Skeet

1
如果数组的大小是已知的(我将假设大小为3,与您的示例相同),则可以将元素相加,然后将结果转换为枚举类型。
private AfpRecordId GetAfpRecordId(byte[] tempData){
    var temp = tempData[0] * 256*256 + tempData[1] * 256 +tempData[2];
    return (AfpRecordId)temp;
}

另一种方法是使用位移运算符。
private AfpRecordId GetAfpRecordId(byte[] tempData){
    var temp = (int)tempData[0]<<16 + (int)tempData[1] * 8 +tempData[2];
    return (AfpRecordId)temp;
}

2
请注意,这假设 tempData 有三个元素。这可能是一个有效的假设,但也可能不是。 - Jon Skeet
@JonSkeet 是的,它确实假设了这一点(基于示例代码)。我已经更新了答案,以突出这个假设。感谢您的评论。 - Rune FS

1
假设tempData有3个元素,请使用Enum.GetName(typeof(AfpRecordId), tempData[0] * 256*256 + tempData[1] * 256 +tempData[2])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接