将枚举标志附加到循环中的参数(按位追加)

时间:2011-11-29 21:00:52

标签: c# bit-manipulation enum-flags

在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属性中。我不知道如何在循环中执行此操作而不使用按位OR“|”运营商。这是我想要做的事情:

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

从概念上讲,这就是我想要的,但我不能“+ =”循环中的值到参数。

4 个答案:

答案 0 :(得分:18)

您无需拆分。如果使用枚举定义中的[Flags]属性,Enum.Parse能够解析多个值。只需解析并使用| =运算符“添加”标志。

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

有关枚举,位标志和System.Enums方法的更多信息,请参阅我的教程:http://motti.me/s1D

以下是整个教程的链接:http://motti.me/s0

我希望这会有所帮助。

答案 1 :(得分:4)

使用|=运算符。

myObj.Protection |= (ProtectionOptions) Enum.Parse(typeof (ProtectionOptions), protectionOption.Trim());

答案 2 :(得分:1)

你为什么不能这样做?

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)的等效整数,并将其作为整数加载。

答案 3 :(得分:0)

您想使用compound OR assignment operator

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

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