假设我们有这些复选框:
而这些方法:
我只想在选中相应的复选框时调用每个方法.代码可能如下所示:
void DoWork()
{
if (FooCheckBox.Checked)
{
Foo();
Console.WriteLine("Foo was called");
}
if (BarCheckBox.Checked)
{
Bar();
Console.WriteLine("Bar was called");
}
if (BazCheckBox.Checked)
{
Baz();
Console.WriteLine("Baz was called");
}
}
Run Code Online (Sandbox Code Playgroud)
现在考虑使用3个复选框和3个方法,而不是更多.你会如何重写上面的代码使其更干?
我会说你提出的情况,保持原样; 你不想在没有充分理由的情况下过度抽象,因为它可以使代码库不易维护.当然,语境很重要,而且它最终是一种判断力.
那就是说,我就是这样做的.创建一个集合,其中每个项目都包含控件和操作委托.然后循环并执行每个项目的逻辑.
var items = new KeyValuePair<CheckBox, Action>[] {
new KeyValuePair<CheckBox,Action>(FooCheckBox, Foo),
new KeyValuePair<CheckBox,Action>(BarCheckBox, Bar),
new KeyValuePair<CheckBox,Action>(BazCheckBox, Baz)
};
foreach (var item in items)
{
if (item.Key.Checked)
{
item.Value.Invoke();
Console.WriteLine("Invoked " + item.Value.Method.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
或者(可能?)更好地使用Linq:
items.Where(item => item.Key.Checked).ToList().ForEach(item => new {
item.Value.Invoke();
Console.WriteLine("Invoked " + item.Value.Method.Name);
});
Run Code Online (Sandbox Code Playgroud)
您可以使用词典来跟上哪些操作引用哪些复选框.然后你可以做以下事情:
foreach(KeyValuePair<CheckBox, Action> kvp in Dict)
{
if(kvp.Key.Checked)
kvp.Value.Invoke();
}
Run Code Online (Sandbox Code Playgroud)