flags 属性が設定されている (より正確にはビット操作に使用される) 列挙型をオンにするにはどうすればよいですか?
宣言された値に一致するスイッチですべてのケースをヒットできるようにしたい。
問題は、次の列挙型がある場合
[Flags()]public enum CheckType
{
Form = 1,
QueryString = 2,
TempData = 4,
}
このようなスイッチを使いたい
switch(theCheckType)
{
case CheckType.Form:
DoSomething(/*Some type of collection is passed */);
break;
case CheckType.QueryString:
DoSomethingElse(/*Some other type of collection is passed */);
break;
case CheckType.TempData
DoWhatever(/*Some different type of collection is passed */);
break;
}
「theCheckType」が両方の CheckType.Form に設定されている場合 | CheckType.TempData 両方のケースにヒットさせたい。明らかに、ブレークのために私の例では両方にヒットしませんが、CheckType.Form が CheckType.Form | と等しくないため、それ以外にも失敗します。CheckType.TempData
私が見ることができる唯一の解決策は、列挙値の可能なすべての組み合わせのケースを作成することですか?
何かのようなもの
case CheckType.Form | CheckType.TempData:
DoSomething(/*Some type of collection is passed */);
DoWhatever(/*Some different type of collection is passed */);
break;
case CheckType.Form | CheckType.TempData | CheckType.QueryString:
DoSomething(/*Some type of collection is passed */);
DoSomethingElse(/*Some other type of collection is passed */);
break;
... and so on...
しかし、それは実際にはあまり望まれていません (すぐに非常に大きくなるからです)。
現在、代わりにお互いの直後に 3 つの If 条件があります
何かのようなもの
if ((_CheckType & CheckType.Form) != 0)
{
DoSomething(/*Some type of collection is passed */);
}
if ((_CheckType & CheckType.TempData) != 0)
{
DoWhatever(/*Some type of collection is passed */);
}
....
しかし、それはまた、20個の値を持つ列挙型がある場合、スイッチを使用するときのように必要な「ケース」/にのみ「ジャンプ」するのではなく、毎回20個のIf条件を通過する必要があることも意味します。
この問題を解決するための魔法の解決策はありますか?
宣言された値をループしてからスイッチを使用する可能性を考えましたが、宣言された各値に対してのみスイッチをヒットしますが、それがどのように機能するかはわかりません。多くの場合と比較して)?
宣言されたすべての列挙値をループする簡単な方法はありますか?
ToString() を使用して "," で分割し、配列をループしてすべての文字列を解析することしか考えられません。
アップデート:
十分な説明ができていないことがわかりました。私の例は単純です(私のシナリオを単純化しようとしました)。
Asp.net MVC の ActionMethodSelectorAttribute に使用して、URL/ルートを解決するときにメソッドを使用できるかどうかを判断します。
メソッドでこのようなことを宣言することでそれを行います
[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
return View();
}
これは、Form または TempData がメソッドを使用できるように指定されたキーを持っているかどうかを確認する必要があることを意味します。
呼び出すメソッド (前の例では doSomething()、doSomethingElse()、および doWhatever()) は、実際には戻り値として bool を持ち、パラメーター (使用できるインターフェイスを共有しない異なるコレクション) で呼び出されます。使用 - 以下のリンクにあるサンプル コードを参照してください)。
うまくいけば、私が何をしているのかをよりよく理解するために、私が実際に行っていることの簡単な例をペーストビンに貼り付けました - ここで見つけることができますhttp://pastebin.com/m478cc2b8