我該如何打開一個枚舉,它具有flags屬性集(或者更確切地說是用於位操作)?打開枚舉(帶標誌屬性),但未聲明每種可能的組合?
我希望能夠在匹配聲明值的開關中擊中所有情況。
的問題是,如果我有以下枚舉
[Flags()]public enum CheckType
{
Form = 1,
QueryString = 2,
TempData = 4,
}
,我想如果「theCheckType」設置爲兩個CheckType.Form使用開關這樣
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;
}
| 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 ((_CheckType & CheckType.Form) != 0)
{
DoSomething(/*Some type of collection is passed */);
}
if ((_CheckType & CheckType.TempData) != 0)
{
DoWhatever(/*Some type of collection is passed */);
}
....
但這也意味着,如果我有一個枚舉wi它必須經歷20個值如果每一次都滿足條件,而不是像使用開關那樣「跳躍」到僅僅需要的「案例」。
是否有一些神奇的解決方案來解決這個問題?
我想過可能性循環聲明的值,然後使用開關,然後它只會打開每個值聲明的開關,但我不知道它將如何工作,如果它的性能副是一個好主意(與很多if相比)?
是否有一種簡單的方法來遍歷所有聲明的枚舉值?
我只能想出使用ToString()和「」分割,然後遍歷數組並解析每一個字符串。
UPDATE:
我看到,我沒有做工作不夠好解釋。 我的例子是簡單的(試圖簡化我的方案)。
我將它用於Asp.net MVC中的ActionMethodSelectorAttribute,以確定解析url/route時是否應該有可用的方法。
我通過在方法
[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
return View();
}
這將意味着它應該檢查是否按照規定的方法可用於窗體或TempData的有一個關鍵的聲明是這樣做的。在我之前的例子中doSomething(),doSomethingElse()和doWhatever())方法實際上會有bool作爲返回值,並且會被一個參數調用(不同的集合不共享一個可以使用的接口 - 請參閱下面鏈接中的示例代碼等)。
爲了希望給的我在做什麼我都粘貼的什麼,我實際上做對引擎收錄一個簡單的例子,一個更好的主意 - 它可以在這裏找到http://pastebin.com/m478cc2b8
感謝您的回答。 我已更新我的原始帖子。 我不認爲有可能使用字典,因爲我在一個屬性中聲明它(參見示例) - 或者至少我不知道它應該如何完成。 – MartinF 2009-06-24 22:33:39
對於MartinF的問題可能不夠充分,但非常優雅... +1;) – 2009-07-06 23:59:09
Enum(...)。GetValues返回一個Array;你不能使用'Where。 – BillW 2016-05-05 04:10:08