无法在方法内传递函数参数

时间:2018-07-30 23:52:09

标签: c#

我正在尝试将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;
    }
}

2 个答案:

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