我有一个方法,它从文件中获取一些参数,并根据这些非常动态的参数做一些不同的操作。此方法也应该根据文件中的参数调用不同的方法。任何人都可以提出更好的方法吗?
我目前正在使用这种方法:
public void MethCaller(string FileName)
{
//File operations to fetch parameters from file.
if(some_parameter)
{
foo(other_parameter1,other_prameter2);
}
else
{
bar(other_parameter3,other_prameter4);
}
}
答案 0 :(得分:0)
在结构上,这是最干净的方式。你可以玩反思,代表词典等,但所有人都有利弊。
基本上你正在构建的是一个基本的strategy pattern。根据动作的相似程度(参数的类型和顺序等),有不同的方法可以接近它。
最简单的更改是将该决策分解为另一种方法:
public void MethodCaller(string FileName)
{
//File operations to fetch parameters from file.
Route(some_parameter,
other_parameter1, other_parameter2,
other_parameter3, other_parameter4);
}
public void Route(string some_parameter, parms object[] parameters)
{
if(some_parameter)
{
foo(parameters[0],parameters[1]);
}
else
{
bar(parameters[2],parameters[3]);
}
}
当然,从那里你可以将调用移动到一个单独的类,也许是一个使用路由表(字符串/委托对的字典)等等,但没有任何更简单比你有的现在。你所做的只是以简单为代价来解决问题的分离。
答案 1 :(得分:0)
如果方法foo()
和bar()
具有相同的签名,我建议您使用代理。还有另一种方法可以做到这一点。希望这可以帮到你。
为方法
声明一些委托public delegate void foo_dele(type1 param1,type2 param2);
public delegate void bar_dele(type1 param1,type2 param2); // the arguments may vary.
现在将这些内容传递给您的MethCaller()
public void MethCaller(string FileName,foo_dele delfoo , bar_dele delbar)
{
//File operations to fetch parameters from file.
if(some_parameter)
{
delefoo = foo;
}
else
{
delebar = bar;
}
//call the dele if its got a reference to a method in it.
if(!(delefoo.Target || delfoo.Method))
{
delfoo(pram1,param2);
return;
}
delbar(param3,param4);
return;
}