我该如何打开一个枚举,它具有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