C#Pass Method作为带有Action和Func委托的不同参数的参数

时间:2017-10-13 10:00:41

标签: c# wcf delegates

我的代码中有一个场景,我需要将方法作为参数传递给另一个调用的方法。

我的方法有不同的参数,返回类型也各不相同,

Public int Method1(int a, int b){
 return a+b;

}

public DataSet Method2(int a, string b, sting c, DataSet ds){
//make call to database and get results in dataset.
DataSet ds = new DataSet();
return ds;
}

上述方法需要从单独的方法调用

public void InvokeMethod(Action action){
   action();
}

Action参数可以是method1或method2,但问题是如何获得method1和method2不同的返回类型。

如果我使用Func,我将无法在运行时告知输入参数的数量。

实际上,我尝试通过wcf通道上的包装器调用服务操作,以便我可以处理该方法中任何调用的任何异常......

例如: Channel.GetAllNames(int a,string b)是一个实际的调用。这个调用应该通过一个通用的方法。调用CallAllOperations。

public void CallAllOperations(Action action){
try{ 
action();
}
catch(exception e){
//catch exceptions of all calls instead of one call.
}
}

1 个答案:

答案 0 :(得分:1)

您可以将您的委托包装在lambda中。例如:

假设您创建了两个委托:

Func<DateTime> getTime = BuildGetTimeDelegate();
Func<int, int, int> getSum = BuildSumDelegate();

现在想在特定数据上使用它们:

DateTime time;
int sum;
int a = 5;
int b = 10;

你可以给你的调用方法lambdas:

InvokeMethod(()=>time = getTime());
InvokeMethod(()=>sum = getSum(a,b));

这意味着您必须在将委托转换为Action时解析输入和输出变量。