我想用字典对象和提供的命令行参数做一些'动态'的事情。命令行参数是布尔值,然后我可以调用方法,如果它们中的任何一个为真。所以......
public class CommandLineArguments
{
public bool AddSection1 { get; set; }
public bool AddSection2 { get; set; }
public bool Addsection3 { get; set; }
}
class RunSomeActions
{
private Dictionary<bool, Action> methodList = new Dictionary<bool, Action>();
public RunSomeActions()
{
// create the switches as if from a command line
CommandLineArguments parameters = new CommandLineArguments();
parameters.AddSection1 = true;
parameters.AddSection2 = false;
parameters.Addsection3 = true;
// setup the methods for the switches
methodList.Add(parameters.AddSection1, this.Section1);
methodList.Add(parameters.AddSection2, this.Section2);
methodList.Add(parameters.Addsection3, this.Section3);
foreach (var entry in methodList)
{
// if the switch is on
// call the method
if (entry.Key)
methodList[entry.Key]();
}
}
private void Section1()
{
// add specific entries into a file
}
private void Section2()
{
// perform analysis on a file
}
private void Section3()
{
// delete everything and start again
}
}
如果你只有两个真值和假值,那么效果很好,所以它真的不太好。我对这种方法所做的就是不必手动解析参数,然后构建一个Action列表。有没有办法可以挽救这种设计?
答案 0 :(得分:3)
由于您实际上并未使用字典进行查找,而只是用于存储和迭代,而不是使用Dictionary<K,V>
,因此您只需使用List<KeyValuePair<K,V>>
即可。
与代码角度的主要区别在于:添加到:
methodList.Add(new KeyValuePair<bool, Action>(parameters.AddSection1, this.Section1));
然后,当您使用时,切换到:
foreach (var entry in methodList)
{
// if the switch is on
// call the method
if (entry.Key)
entry.Value(); // Execute "value" directly
}
话虽如此,您可以更进一步,可能直接存储List<Action>
。仅将操作添加到条件为true的列表中,然后全部执行。
答案 1 :(得分:0)
我建议创建一个结构。
struct MethodListItem
{
bool IsActive;
Action Action;
}
然后将methodList
声明为(惊讶)List<MethodListItem>
,并添加如下:
methodList.Add(new MethodListItem { IsActive = parameters.AddSection1, Action = this.Section1});
methodList.Add(new MethodListItem { IsActive = parameters.AddSection2, Action = this.Section2});
methodList.Add(new MethodListItem { IsActive = parameters.Addsection3, Action = this.Section3});
然后循环体变得更具可读性:
foreach (var entry in methodList)
{
// if the switch is on
// call the method
if (entry.IsActive) entry.Action();
}