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