根据Enum值获取Enum名称

本文关键字:Enum 名称 获取 根据 | 更新日期: 2023-09-27 18:13:00

我声明了以下Enum:

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

,我想从value中检索枚举对象:

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,只有当它们能提供更好或相等的性能。

根据Enum值获取Enum名称

Simple:

  • 将字节数组转换为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。

至于性能——在你寻找更快的东西之前,先检查一下简单的东西是否能给你足够好的性能。

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

如果数组的大小已知(根据您的示例,我假设大小为3),则可以将元素加在一起,并将结果强制转换为enum

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;
}