我必须读/写一个XML文件,该文件将其数据存储为位掩码值。
例如
<panel>
<options arming="21" opt_b="51" opt_c="6" />
</panel>
在这种情况下,arming
的值为21
,但它对应于以下字节串:
10101
这些字节对应于以下列表中的选项0,2,4:
- 位0:强制臂
- Bit 1:最终门
- 位2:退出故障
- Bit 3:禁止篡改
- 位4:显示
- Bit 8:重新排列
- Bit 9:线路
- Bit 10:扩展块
对我来说去最好的方法是什么
- 将其从
21
的十进制值转换为表示选项的对象模型 - 使用该对象将这些显示为供用户选择和取消选择的选项
这样声明枚举:
[Flags]
public enum ArmingFlags {
None=0
Forced_arm = 1
Final_door = 2
Exit_fault = 4
Inhibit_tamper = 8
Display = 16
Rearm = 32
Line = 64
Extend_block = 128
}
注意我在枚举中使用的二次幂。这些允许枚举使用二进制位位置来表示离散值(请参阅为什么枚举权限通常有0、1、2、4个值?)
然后将您的值解析为一个整数,并将其转换为ArmingFlags类型(注意,未经测试的代码在前面,但应该有效):
ArmingFlags flagsVal = ArmingFlags.None;
Int32 val;
if (Int32.TryParse(armingString, out val)) {
flagsVal = (ArmingFlags)val;
}
// Then you can test it for expected values:
if ((flagsVal & ArmingFlags.Rearm) == ArmingFlags.Rearm) {
//The Rearm bit was set...
}
有很多关于如何在WPF组合框或单选按钮中使用枚举的帖子,例如:
将枚举属性数据绑定到WPF 中的组合框
如何使用枚举的功能来帮助您:
[Flags]
public enum AlarmData
{
ForcedArm = 1,
FinalDoor = 2,
ExitFault = 4,
InhibitTamper = 8,
Display = 16,
Rearm = 32,
Line = 64,
ExtendBlock = 128
}
private static Dictionary<AlarmData, string> alarmDataLookup = new Dictionary<AlarmData, string>
{
{ AlarmData.ForcedArm, "Forced arm" },
{ AlarmData.FinalDoor, "Final door" },
{ AlarmData.ExitFault, "Exit fault" },
{ AlarmData.InhibitTamper , "Inhibit tamper" },
{ AlarmData.Display , "Display" },
{ AlarmData.Rearm , "Rearm" },
{ AlarmData.Line , "Line" },
{ AlarmData.ExtendBlock , "Extend block" }
};
public IEnumerable<string> EnumerateValues(AlarmData data)
{
return from pair in alarmDataLookup
where data.HasFlag(pair.Key)
select pair.Value;
}
从XML中读取值后,调用EnumerateValues很简单,只需将整数强制转换为AlarmData枚举即可,例如:
int value = GetAlarmValueFromXml();
var bindableValues = EnumerateValues((AlarmData)value);
当然,您不必从EnumerateValues方法返回字符串。然后,您所需要做的就是将方法的结果绑定到列表或其他元素,Bob就是您的叔叔。