结果未知类型的任务

时间:2015-04-21 08:04:08

标签: c# asynchronous asp.net-web-api async-await

我正在处理异步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));
}

2 个答案:

答案 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