如何使用枚舉的力量來幫助你走好人生路:
[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;
}
調用EnumerateValues很簡單,一旦你讀出從XML值,只投整數作爲AlarmData枚舉,如:
int value = GetAlarmValueFromXml();
var bindableValues = EnumerateValues((AlarmData)value);
當然,你不必從EnumerateValues方法返回字符串。然後你需要做的就是將方法的結果綁定到列表或其他元素,而鮑勃是你的叔叔。
謝謝,這工作。注意 - 我已經編輯了答案來添加一些括號。只是想知道,爲什麼要寫'((flagsVal&ArmingFlags.Rearm)== ArmingFlags.Rearm)'? '(flagsVal == ArmingFlags.Rearm)'不能工作嗎?這似乎是多餘的,但我見過其他一些例子。當我用兩個例子對它進行測試的時候,它工作。 – DaveDev 2012-04-03 15:51:40
您想要測試(可能)多個標誌中的單個標誌。例如,您在OP(10101)中顯示的值不等於ArmingFlags.Forced_arm(它是'ArmingFlags.Forced_arm&ArmingFlags.Exit_fault&ArmingFlags.Display')。要測試特定的標誌位,需要過濾掉所有其他1的值,然後執行相等性測試。 – 2012-04-03 16:06:04
真的這是最好的解釋在我上面鏈接的帖子:http://stackoverflow.com/questions/9811114/why-do-enum-permissions-often-have-0-1-2-4-values/9811145#9811145 – 2012-04-03 16:06:49