我有一个接收此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)
也许我误解了一些事情,如果是这样,请解释我......
如果我理解正确的,你想讨好一个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)