回答您的实际问题:
如果 switch 语句中有一种方法可以执行所有情况。
不是我能想到的干净方式。
我建议稍微改变一下模式,改为将task 改为flag enum
[Flags]
public enum TaskOptions
{
Print = 1,
Save = 2,
SendMail = 4,
//Note that these numbers go up in powers of two
}
然后您可以执行以下操作:
task = TaskOptions.Print | TaskOptions.Save;
if (task.HasFlag(TaskOptions.Print))
{
print();
}
if (task.HasFlag(TaskOptions.Save))
{
save();
}
if (task.HasFlag(TaskOptions.SendMail))
{
sendMail();
}
您不再需要明确地担心all
如果你想添加一个新选项
[Flags]
public enum TaskOptions
{
Print = 1,
Save = 2,
SendMail = 4,
NewOption = 8,
}
task = TaskOptions.Print | TaskOptions.Save;
if (task.HasFlag(TaskOptions.Print))
{
print();
}
if (task.HasFlag(TaskOptions.Save))
{
save();
}
if (task.HasFlag(TaskOptions.SendMail))
{
sendMail();
}
if (task.HasFlag(TaskOptions.NewOption))
{
newOption();
}
Jaymee 要求澄清 | 和 &
你能解释一下task = TaskOptions.Print | 的语法吗?任务选项。保存。不确定这里管子的使用,我以为是'或',但这里没有评价!?事实上,对于单个 & 符号也是如此 - 以前从未见过它以这种方式使用过
这些是位运算符。它们逐位比较两个数字并返回结果。
在我们的示例中,我们使用了 4 个标志,每个标志都由一个布尔值表示。一个布尔值可以用一位来表示。
让我们使用以下缩写:
Print = P
Save = S
SendMail = M
NewOption = N
8 4 2 1
N M S P
我以task = TaskOptions.Print | TaskOptions.Save为例
0 0 0 1 P is declared as 1 in the enum.
0 0 1 0 S is declared as 2 in the enum.
==========
0 0 1 1 < I've "or'd" these numbers together. They now represent Print AND Save as one option. The number "3" (binary 0011) is equivalent to "print and save"
当我有“3”并且我想知道它是否包含特定标志时,我& 带有该标志。
N M S P
0 0 1 1 //This is P & S
0 0 0 1 //And we want to check if it has "P"
==========
0 0 0 1 < this returns non-zero. it contains the flag!
让我们为 N 做同样的事情
N M S P
0 0 1 1 //This is P & S
1 0 0 0 //And we want to check if it has "N"
==========
0 0 0 0 < this returns zero. This state doesn't contain "N"
大卫·阿诺编辑
要添加到这个答案,而不是拥有一系列 ifs,可以使用 Dictionary 和 for 循环:
private readonly Dictionary<TaskOptions, Action> actions =
new Dictionary<TaskOptions, Action>
{
{ TaskOptions.Print, Print },
{ TaskOptions.Save, Save },
{ TaskOptions.SendMail , SendMail }
};
...
var task = TaskOptions.Print | TaskOptions.Save;
foreach (var enumValue in Enum.GetValues(typeof(TaskOptions)).Cast<TaskOptions>())
{
if (task.HasFlag(enumValue))
{
actions[enumValue]();
}
}