我正在尝试将Func<TResponse, T1, T2>
传递给此方法。我仍然收到“ method()”的语法错误。它说它需要两个有意义的参数,但是如何将其传递给方法?我已将它们指定为T1和T2。
我该如何也返回TResponse?
我的调用方式(我想用来调用该方法的函子)。
_service.Count(fileDate (DateTime), cycle int));
我在这里做什么错了?
public TResponse ExecuteAndLog<T1, T2,TResponse>(Guid id, string Name, Func<T1, T2, TResponse> method) where TResponse : class
{
try
{
Log(id, Name);
TResponse x = method();
Log(id, Name);
}
catch (Exception ex)
{
Log(id, Name);
throw;
}
}
答案 0 :(得分:3)
我猜你真的想要这个。...
public TResponse ExecuteAndLog<TResponse>(Guid id, string Name, Func<TResponse> method) where TResponse : class
{
try
{
Log(id, Name);
TResponse x = method();
Log(id, Name);
}
catch (Exception ex)
{
Log(id, Name);
throw;
}
}
然后用
var response = ExecuteAndLog(someGuid, someName, () => _service.Count(fileDate, cycle));
这样,您只需要一个ExecuteAndLog原型。如果您将输入包含在Func
中(如您在示例中所做的那样),则必须传递参数,并且每个可能的服务调用签名都需要使用不同版本的ExecuteAndLog。>
注意:每当以这种方式使用lambda表达式时,请注意closures。
答案 1 :(得分:2)
如果method
应该收到两个参数,则需要传递它们:
public TResponse ExecuteAndLog<T1, T2,TResponse>(Guid id, string Name, Func<T1, T2, TResponse> method, T1 arg1, T2 arg2) where TResponse : class
{
try
{
Log(id, Name);
TResponse x = method(arg1, arg2);
Log(id, Name);
return x;
}
catch (Exception ex)
{
Log(id, Name);
throw;
}
}