如何从方法动态调用函数?

时间:2015-11-20 12:53:46

标签: c# .net optimization

我有一个方法,它从文件中获取一些参数,并根据这些非常动态的参数做一些不同的操作。此方法也应该根据文件中的参数调用不同的方法。任何人都可以提出更好的方法吗?

我目前正在使用这种方法:

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);
     }
}

2 个答案:

答案 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;
}