2012-01-27 6 views
1

私は、次の列挙元の値を取得するためにビットをどのようにデコードするのですか?

[Flags] 
enum Options 
{ 
    Option1 = 1 << 0, 
    Option2 = 1 << 1, 
    Option3 = 1 << 2 
} 

を持っていると私は

var options = 0; 
options |= Options.Option1; 
options |= Options.Option3; 

// now options should equal Option1 + Option3 
// I then store that single value in the database 
myDatabase.Options.Submit(options); 

がどのように私はその後、元の値を取得するために、「オプション」を解析するか、次のように変数を設定していたと仮定すると?

public List<Options> ParseOptions(Options options) 
{ 
    // Not sure how to parse the options. 
} 
+0

'オプション&Options.Option3 = 0 '< - オプション3が選択されています! 。 (私は思う) – Joe

+0

あなたは正しいです、ちょうどタイプの競合を避けるために、かっこの間に右にステートメントを入れてください。注意: '(オプション&Options.Option3)== Options.Option3':0でない返さint型の場合は0があなたの列挙の値ではない場合は、チェックしますすることができます私はをお勧めします(それが原因の競合することができます)。 –

答えて

6

あなたが特定のフラグが設定されているかどうかを確認するためにEnum.HasFlag()メソッドを使用することができます。それが設定されている場合は、すべての個別の値のテストを通過してください。

var value = Options.Option1 | Options.Option3; 
foreach (Options flag in Enum.GetValues(typeof(Options))) 
{ 
    if (value.HasFlag(flag)) 
    { 
     // do something with the flag 
    } 
} 

HasFlag()方法は、それはしかし、これと論理的に等価である.NET 4に追加されたことを注意:

public static bool HasFlag(this Enum value, Enum flag) 
{ 
    return (value & flag) == flag; 
} 
+0

+1スーパーメルカード!知識をありがとう。 – Joe

1

ような何か:

public List<Options> ParseOptions(Options options)  
{ 
    var list = new List<Options>(); 

    foreach(MyEnum val in Enum.GetValues(typeof(myEnum))) 
    { 
     if ((val & options) == val) 
      List.Add(val); 
    } 

    return list; 
} 

(Visual Studioで検証されていない)

+0

C#4.0では、ビットごとの&の代わりに 'if(options.HasFlag(val)){...}'を使うことができます。 –

+0

か: '(ヴァル&オプション)= 0 ' – Jack

+0

@Jack:厳密に言えば、それを行う方が良いでしょう('ヴァル&オプション)== option'、列挙型は、いくつかのクレイジーなマルチビット値で設定されているだけの場合には'val'と' option'の間には部分的な重複しかありません。 – LukeH

関連する問題