传递带有参数 Func 的方法<T>并获取 TResult



所以基本上T有一个返回类型,我想找回泛型返回类型。例:

private TResult EndInvoke<T, TResult>(Func<T, TResult> asyncCaller, IAsyncResult asyncResult)
{
    TResult result = default(TResult);
    try
    {
        result = asyncCaller.EndInvoke(asyncResult);
    }
    catch (Exception exception)
    {
       // get exception details.
    }
    return result;
}

如何只传递调用该方法的 T 并获取 TResult?请注意,我只有T。

编辑:我的意思是我如何调用此方法?

编辑:我想要一个通用的EndInvoke,因为我是不同EndInvokes的巨大尝试,然后我想要EndInvoke的结果。

我建议先将通用EndInvoke<,>方法转换为扩展方法。

public static class FuncExtensions
{
    public static TResult EndInvoke<T, TResult>(this Func<T, TResult> asyncCaller, IAsyncResult asyncResult)
    {
        // ...
    }
}

这将简化方法调用。例如,我将调用一个计算整数平方的方法。

private int Square(int x)
{
    return x * x;
}

在客户端代码中,可以这样调用它:

Func<int, int> caller = new Func<int, int>(Square);
int x = 5;
int y = default(int);
caller.BeginInvoke(x,
    asyncResult =>
    {
        y = caller.EndInvoke(asyncResult);
    },
    null);
Console.WriteLine("The square of {0} is {1}", x, y);

编辑

此示例尚未以任何方式进行测试,并且包含明显的争用条件。

不确定我是否正确理解,但我认为如果你想要 Func 返回值,你应该删除 IAsyncResult。

例:

private TResult GetResult<T, TResult>(Func<T, TResult> asyncCaller, IAsyncResult asyncResult)
    {
        TResult result = default(TResult);
        result = asyncCaller(argument...);
        return result;
    }

相关内容

最新更新