我正在开发异步 CQS API
WebAPI 方法如下所示
public async Task<object> Get([FromUri] Contract contract)
{
return await _invoker.Invoke(CreateDto<Query>(contract));
}
Cannot implicitly convert type '
System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Customer>>
' to 'System.Threading.Tasks.Task<object>
如何在不知道类型的情况下从结果返回任务?
这是调用泛型类的代码
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>
有什么原因吗?暴露为任务?如果我从 Task 更改为普通 Task,它就不起作用。它仍然是一个任务,所以 WebApi 应该能够用一些魔法来解决这个问题?我想做这个
public Task Get([FromUri] Contract contract)
{
return _invoker.Invoke(CreateDto<Query>(contract));
}
最佳答案
这个问题有点困惑。特别不清楚错误消息的来源。根据您发布的小代码,我认为唯一有意义的是您实际上是在 return
收到该错误消息。您的声明Invoke()
方法。 IE。那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可靠地重现问题。
关于c# - 结果类型未知的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29766333/