Добавить флаги Enum к параметру в цикле (добавление по битам) - PullRequest
3 голосов
/ 30 ноября 2011

В C # я пытаюсь «добавить» значения к параметру, который принимает перечисляемые флаги.Я могу сделать это в одной строке с помощью побитового оператора «|», но я не могу добавить параметр к циклу.

У меня следующий Enum указан как Flags.

[Flags]
public enum ProtectionOptions
{
  NoPrevention = 0,
  PreventEverything = 1,
  PreventCopying = 2,
  PreventPrinting = 4,
  PrintOnlyLowResolution = 8
}

Теперь я могу легко использовать следующий код для добавления значений флагов к параметру:

myObj.Protection = ProtectionOptions.PreventEverything | ProtectionOptions.PrintOnlyLowResolution;

Но я хочу получить список параметров защиты из строки CSV (из Web.Config), переберите их и добавьте в мое свойство myObj.ProtectionOptions.Я не знаю, как сделать это в цикле без использования побитового ИЛИ "|"оператор.Вот что я хочу сделать:

string protectionOptionsString = "NoPrevention, PreventPrinting";
string[] protectionOptions = protectionOptionsString.Split(',');
foreach (string protectionOption in protectionOptions)
{
  myObj.Protection += (ProtectionOptions) Enum.Parse(typeof (ProtectionOptions), protectionOption.Trim());
}

Концептуально это то, что я хочу, но я не могу "+ =" значения в цикле для параметра.

Ответы [ 4 ]

18 голосов
/ 30 ноября 2011

Вам не нужно разделять.Enum.Parse способен анализировать несколько значений, если вы используете атрибут [Flags] в определении enum, что вы и сделали.Просто проанализируйте и используйте оператор | = для «добавления» флагов.

string protectionOptionsString = "NoPrevention, PreventPrinting";
myObj.Protection |= (ProtectionOptions)Enum.Parse(typeof(ProtectionOptions), protectionOptionsString);

Для получения дополнительной информации о перечислениях, битовых флагах и методах System.Enums здесь есть прямая ссылка на мое руководство:*http://motti.me/s1D

Вот ссылка на весь учебник: http://motti.me/s0

Надеюсь, это поможет.

4 голосов
/ 30 ноября 2011

Используйте оператор |=.

myObj.Protection |= (ProtectionOptions) Enum.Parse(typeof (ProtectionOptions), protectionOption.Trim());
1 голос
/ 30 ноября 2011

Почему вы не можете сделать это?

string protectionOptionsString = "NoPrevention, PreventPrinting";
string[] protectionOptions = protectionOptionsString.Split(',');
foreach (string protectionOption in protectionOptions)
{
  myObj.Protection |= (ProtectionOptions) Enum.Parse(typeof (ProtectionOptions), protectionOption.Trim());
}

В качестве альтернативы, вы можете сохранить целочисленный эквивалент перечисления ((Int32)myObj.Protection) и загрузить его как целое число.

0 голосов
/ 30 ноября 2011

Вы хотите использовать составной ИЛИ оператор присваивания .

string protectionOptionsString = "NoPrevention, PreventPrinting";
string[] protectionOptions = protectionOptionsString.Split(',');

foreach (string protectionOption in protectionOptions)
{
  myObj.Protection |= (ProtectionOptions)Enum.Parse(typeof(ProtectionOptions), 
                                                    protectionOption.Trim());
}
...