我有一种方法可以接收此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);
也许我误会了一些东西,如果是这种情况,请给我解释一下...
答案 0 :(得分:5)
如果我理解正确,那么您想curry和Func<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));