与将Task<TResult>中的TResult转换为System.Object相关。我正在为一个服务构建一个通用的异步命令执行函数。
执行通用命令的方法如下:
public async Task<object> ExecuteCommandAsync(string cmdName, CommandData data)
代码使用反射在类中查找具有给定cmdName的方法。调用此方法将返回一个>,我们无法提前知道T的类型。但是,由于Task不是协变的,所以我无法转换为Task。
目前,我的解决方案(根据21805564)是调用Result方法,并封装在Task.Run中,如下所示:
// find the method
MethodInfo cmd = GetMethod(cmdName);
var task = (Task)cmd.Invoke(this, data);
return await Task.Run<object>(() => { return task.GetType().GetProperty("Result").GetValue(task); });
我的担忧是这样做会抵消异步的价值:获取结果现在成了阻塞调用,所以我可能也可以使用同步方法。
T
是否与cmdName
一一对应? - Kaveh Shahbazian