C#将Func方法签名转换为新的Func方法签名

时间:2019-01-16 08:04:03

标签: c# linq lambda

我有一种方法可以接收此Func作为参数

Func<IContext, IReadOnlyCollection<T>> func

碰巧我需要记录上述Func的执行时间。 我已经有一个记录执行时间的函数,并且此方法具有以下签名:

T LogExecutionDuration<T>(Func<T> func);

我的问题是:有一种使用实际方法的方法,还是我需要创建一个新方法来记录它?

我想包装:

  Func<IContext, IReadOnlyCollection<T>> func 
  //into 
  T LogExecutionDuration<T>(Func<T> func);

  //In a way that the "Func<IContext, IReadOnlyCollection<T>> func" 
  //could be passed as parameter for LogExecutionDuration as Func<T> func

我认为类似的可能性是可能的,因为以下是可能的:

public static T Foo<T>(Func<T> func){
    return func();
}

public static TResult Foo<T, TResult>(Func<T, TResult> func, T param){
    return func(param);
}

var foo1 = Foo(() => someObj.someMethod(someParam));
var foo2 = Foo(someObj.someMethod, someParam);

也许我误会了一些东西,如果是这种情况,请给我解释一下...

1 个答案:

答案 0 :(得分:5)

如果我理解正确,那么您想curryFunc<T, R>

您可以编写这样的方法:

public static Func<R> Curry<T, R>(Func<T, R> func, T arg) {
    return () => func(arg);
}

这与您的第二个Foo方法非常相似,因此您处在正确的轨道上。

然后执行:

var curried = Curry(func, someIContext);
LogExecutionDuration(curried);

请注意,您也可以这样做:

LogExecutionDuration(() => func(someIContext));