2016-03-09 6 views
13

Ich habe diese Enum bekamWie Enum Zuordnung in C# optimieren

enum NetopScriptGeneratingCases 
{ 
    AddLogMessages, 
    AddLogErrors, 
    AddLogJournal, 
    AllLog = AddLogMessages | AddLogErrors | AddLogJournal, 
    DoNothing 
} 

Und es gibt UI mit 3 Kontrollkästchen so je nachdem, welche von ihnen überprüft ich mögliche Fälle zu erzeugen, haben einige Arbeit zu tun.

NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing; 

if (checkBoxAddAuditLog.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogJournal; 
} 
else if (checkBoxAddErrorLog.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogErrors; 
} 
else if (checkBoxAddLogMessages.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogMessages; 
} 
else if (checkBoxAddAuditLog.Checked || checkBoxAddErrorLog.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogJournal | NetopScriptGeneratingCases.AddLogErrors; 
} 
else if (checkBoxAddAuditLog.Checked || checkBoxAddLogMessages.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogJournal | NetopScriptGeneratingCases.AddLogMessages; 
} 
else if (checkBoxAddErrorLog.Checked || checkBoxAddLogMessages.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogErrors | NetopScriptGeneratingCases.AddLogMessages; 
} 
else if (checkBoxAddErrorLog.Checked || checkBoxAddLogMessages.Checked || checkBoxAddAuditLog.Checked) 
{ 
    netopScriptGeneratingCases = NetopScriptGeneratingCases.AddLogErrors | NetopScriptGeneratingCases.AddLogMessages | NetopScriptGeneratingCases.AddLogJournal; 
} 


var modifiedFiles = NetopScriptGenerator.GenerateNetopScript(netopScriptGeneratingCases, netopFiles); 

Aber ich bin mir nicht sicher, dass dieser Code ein richtig ist ... Gibt es andere Möglichkeiten, es zu tun?

+9

Wenn Sie vorhaben, Ihre 'enum' als eine Reihe von Flaggen als Sie verwenden Indem Sie sie zusammenstellen, um 'AllLog' zu erstellen, müssen Sie ihnen Werte von Potenzen von 2 geben. Das heißt, Sie sollten die erste auf 1, dann 2, dann 4 setzen und' DoNothing' sollte auf gesetzt werden 0. – juharr

+3

Die Art, wie der Code geschrieben ist, ist fehlerhaft, denke ich, da die erste Überprüfung eine Menge anderer Prüfungen verschlucken wird; Sie sollten mit den spezifischsten versuchen und allgemeinere Fälle bis zum Ende zulassen. –

Antwort

18

würde ich nehmen, was Chris suggest in his answer und weisen Sie Ihre Variable wie folgt:

NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing; 

if (checkBoxAddAuditLog.Checked) 
{ 
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogJournal; 
} 
if (checkBoxAddErrorLog.Checked) 
{ 
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogErrors; 
} 
if (checkBoxAddLogMessages.Checked) 
{ 
    netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogMessages; 
} 
21

Wie im Kommentar erwähnt, gibt der Compiler den Enums standardmäßig einen inkrementierenden Integer-Wert, der nicht zur Verwendung als Bitflags geeignet ist. Versuchen Sie, Ihre Definition wie folgt zu ändern:

[Flags] 
enum NetopScriptGeneratingCases 
{ 
     DoNothing = 0, 
     AddLogMessages = 1<<0, 
     AddLogErrors = 1<<1, 
     AddLogJournal = 1<<2, 
     AllLog = AddLogMessages | AddLogErrors | AddLogJournal 
} 
+0

Addendum: Um das Gegenteil zu tun, so überprüfen Sie, welche gesetzt sind, Sie und gegen dieses Feld (z. B. 'if (Werte & Enum.AddLogMessages)') oder eine Bitmaske von 1s, um sie alle zu bekommen. – edmz