4

C#では、列挙されたフラグを受け入れるパラメーターに値を「追加」しようとしています。ビット演算子「|」を使用して1行で実行できますが、ループ内のパラメーターに追加できないようです。

次の列挙型をフラグとして指定しています。

[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

4 に答える 4

18

分割する必要はありません。列挙型定義で[Flags]属性を使用すると、Enum.Parseは複数の値を解析できます。解析し、|=演算子を使用してフラグを「追加」するだけです。

string protectionOptionsString = "NoPrevention, PreventPrinting";
myObj.Protection |= (ProtectionOptions)Enum.Parse(typeof(ProtectionOptions), protectionOptionsString);
于 2011-11-29T21:13:30.113 に答える
4

演算子を使用し|=ます。

myObj.Protection |= (ProtectionOptions) Enum.Parse(typeof (ProtectionOptions), protectionOption.Trim());
于 2011-11-29T21:03:41.803 に答える
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)に相当する整数を格納して、整数としてロードすることもできます。

于 2011-11-29T21:04:37.050 に答える
0

複合OR代入演算子を使用します。

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

foreach (string protectionOption in protectionOptions)
{
  myObj.Protection |= (ProtectionOptions)Enum.Parse(typeof(ProtectionOptions), 
                                                    protectionOption.Trim());
}
于 2011-11-29T21:03:24.923 に答える