Немного предыстории, я работаю с кодом, написанным кем-то другим.Это REST API, к которому вы можете выдавать запросы и команды, и они обрабатываются в общем виде.
Метод разрешения запросов выглядит примерно так:
[HttpPost]
[Route("query")]
public async Task<Task> ResolveQuery(ApiQuery message)
{
var type = Type.GetType(message.QueryType, true);
var query = this.serializer.Deserialize(message.Payload, type);
var interfaceType = type.GetGenericInterfaces(typeof(IQuery<>)).FirstOrDefault();
var responseType = interfaceType.GetGenericArguments()[0];
var handleMethod = typeof(IQueryBus).GetMethod("ResolveAsync").MakeGenericMethod(responseType);
var task = handleMethod.Invoke(this.bus, new object[] { query }) as Task;
await task;
return task;
}
Я почти увереночень необычно использовать задачи таким образом.
Так что, когда handleMethod вызывается, даже если его результат приводится в виде Задачи, и я вижу действительный результат, когда янаведите указатель мыши на него во время отладки, и у меня нет элемента task.Result
, который я мог бы использовать для возможного приведения.
То, что я пробовал:
Я пытался привести этот handleMethod.Invoke в качествеМне нужен 'resopnseType', использующий Convert.ChangeType(result, responseType);
, но я получаю исключение из-за отсутствия реализации IConvertible.Действительно ли мне нужно реализовать IConvertible для каждого возвращаемого типа?
Я также попытался установить тип возвращаемого значения для Task, но затем мне нужно указать TResponse в ResolveQuery, и это приведет к внутренней ошибке сервера.(Я не уверен, как я определяю TResponse из моего кода вызова).
Я также пытался спросить программиста, что он здесь делает.Он не знает.Он следовал первоначальному совету другого программиста для этой реализации, но этого программиста сейчас нет, иначе я бы спросил его!
Может кто-нибудь сказать мне, как правильно получить мой результат из объекта задачи ивернуть его в режиме RESTful вызывающему клиенту?
Обновление - в ответ на @Yeldar Kurmangaliyev
public interface IQueryBus
{
Task<TResponse> ResolveAsync<TResponse>(IQuery<TResponse> query);
}