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