我的代码中有一个场景,我需要将方法作为参数传递给另一个调用的方法。
我的方法有不同的参数,返回类型也各不相同,
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.
}
}
答案 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时解析输入和输出变量。