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

And*_*dre 2 c# linq lambda

我有一个接收此Func作为参数的方法

Func<IContext, IReadOnlyCollection<T>> func
Run Code Online (Sandbox Code Playgroud)

碰巧我需要记录上面提到的Func执行的持续时间.我已经有一个函数来记录执行的持续时间,这个方法有这个签名:

T LogExecutionDuration<T>(Func<T> func);
Run Code Online (Sandbox Code Playgroud)

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

我想包装:

  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
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

也许我误解了一些事情,如果是这样,请解释我......

Swe*_*per 6

如果我理解正确的,你想讨好一个Func<T, R>.

你可以写这样一个方法:

public static Func<R> Curry<T, R>(Func<T, R> func, T arg) {
    return () => func(arg);
}
Run Code Online (Sandbox Code Playgroud)

这与你的第二种Foo方法非常相似,所以你走在正确的轨道上.

然后做:

var curried = Curry(func, someIContext);
LogExecutionDuration(curried);
Run Code Online (Sandbox Code Playgroud)

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

LogExecutionDuration(() => func(someIContext));
Run Code Online (Sandbox Code Playgroud)