我正在处理异步CQS API
WebAPi方法如下所示
public async Task<object> Get([FromUri] Contract contract)
{
return await _invoker.Invoke(CreateDto<Query>(contract));
}
无法隐式转换类型 &#39;
System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Customer>>
&#39; 到&#39;System.Threading.Tasks.Task<object>
如何在不知道类型的情况下从结果中返回任务?
这是调用Generic类型类的代码
public Task<object> Invoke(Query query)
{
var queryHandlerType = typeof(IQueryHandler<,>);
var queryType = query.GetType();
var queryResultType = queryType.BaseType.GetGenericArguments().First();
var handler = _container.GetInstance(queryHandlerType.MakeGenericType(queryType, queryResultType)) as dynamic;
return handler.Handle(query as dynamic);
}
编辑:WebApi是否有任何理由不支持Task<T>
作为任务公开?如果我从任务更改为普通任务它不起作用。它仍然是一个任务,所以WebApi应该能够用一些魔法来解决它?我想要todo这个
public Task Get([FromUri] Contract contract)
{
return _invoker.Invoke(CreateDto<Query>(contract));
}
答案 0 :(得分:1)
这个问题有点令人困惑。特别不清楚错误消息的来源。基于您发布的小代码,我认为唯一有意义的是,您实际上在return
方法的Invoke()
语句中收到了该错误消息。即handler.Handle(query as dynamic)
返回Task<System.Collections.Generic.IEnumerable<Customer>>
类型的对象。当然,这与Task<object>
不同,因此也是非法的。
如果我理解正确,那么在我看来,您可以通过将Invoke()
方法本身更改为async
来解决此问题,以便您可以重新包装最终返回的System.Collections.Generic.IEnumerable<Customer>
Result
Task<object>
中的对象,而不是当前正在生成的Task<System.Collections.Generic.IEnumerable<Customer>>
:
public async Task<object> Invoke(Query query)
{
var queryHandlerType = typeof(IQueryHandler<,>);
var queryType = query.GetType();
var queryResultType = queryType.BaseType.GetGenericArguments().First();
var handler = _container.GetInstance(queryHandlerType.MakeGenericType(queryType, queryResultType)) as dynamic;
return await handler.Handle(query as dynamic);
}
如果这不能解决您的具体问题,请编辑问题以便更清楚。请提供可靠地重现问题的a good, minimal, complete code example。
答案 1 :(得分:1)
你的问题是Task<T>
不是协变的,即你不能隐含地将Task<Something>
转换为Task<object>
- 例如,与{{1}的转换不同转到IEnumerable<Something>
。
解决此问题的最简单方法是将IEnumerable<object>
方法更改为Get
任务,并在两个单独的语句中返回值,如下所示:
await