C#中的泛型函数声明

Ras*_*usW 11 c# generics

我正在尝试创建一些关于库中方法调用持续时间的统计信息.我想创建一个执行这些重复步骤的通用操作和函数,而不是将每个方法调用包装到包含时间线的库并跟踪它.

例如,对于不返回值的方法,我创建了这个:

    private readonly Action<string, Action> timedAction = (name, action) =>
    {
        var sw = Stopwatch.StartNew();
        action.Invoke();
        trackDuration(name, sw.ElapsedMilliseconds);
    };
Run Code Online (Sandbox Code Playgroud)

可以调用timedAction("methodname", () => lib.methodname()).

我想为返回值的方法做类似的事情,但显然Action不能用于此目的,因为它不能返回值.

有没有办法用泛型来做到这一点Func,所以我不必为每个库方法参数组合声明一个?

sel*_*ami 5

您可以使用这样的通用函数:

private static TValue FuncHandler<TValue>(string name, Func<TValue> func)
{
    var sw = Stopwatch.StartNew();
    var result = func();

    trackDuration(name, sw.ElapsedMilliseconds);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

var result = FuncHandler("name", () => MyMethod(param1));
Run Code Online (Sandbox Code Playgroud)