所以基本上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;
}