使用参数Func <t>传递方法并获取TResult </t>

时间:2014-02-17 07:22:07

标签: c# generics func iasyncresult

所以基本上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的结果。

2 个答案:

答案 0 :(得分:1)

我建议您首先将通用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);

修改

此示例未经过任何方式测试,并且包含明显的竞争条件。

答案 1 :(得分:0)

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

示例:

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

        return result;
    }