Как оптимизировать назначение перечислений в C#
У меня есть это перечисление
enum NetopScriptGeneratingCases
{
AddLogMessages,
AddLogErrors,
AddLogJournal,
AllLog = AddLogMessages | AddLogErrors | AddLogJournal,
DoNothing
}
И есть UI с 3 флажками, так что в зависимости от того, какие из них проверяются, я должен генерировать возможные случаи, чтобы выполнить некоторую работу.
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);
Но я не уверен, что этот код является правильным... Есть ли другие способы сделать это?2 ответа:
Я бы взял то, что предлагает Крис в своем ответе и назначил бы вашу переменную следующим образом:
NetopScriptGeneratingCases netopScriptGeneratingCases = NetopScriptGeneratingCases.DoNothing; if (checkBoxAddAuditLog.Checked) { netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogJournal; } if (checkBoxAddErrorLog.Checked) { netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogErrors; } if (checkBoxAddLogMessages.Checked) { netopScriptGeneratingCases |= NetopScriptGeneratingCases.AddLogMessages; }
Как уже упоминалось в комментарии, компилятор по умолчанию дает перечислениям увеличивающееся целочисленное значение, которое не подходит для использования в качестве bitflags. Попробуйте изменить свое определение следующим образом:
[Flags] enum NetopScriptGeneratingCases { DoNothing = 0, AddLogMessages = 1<<0, AddLogErrors = 1<<1, AddLogJournal = 1<<2, AllLog = AddLogMessages | AddLogErrors | AddLogJournal }