Я реализовал шаблон команды в a project I'm working on. Это в значительной степени текущая структура:Асинхронный метод, возвращающий задачу <T> с общим ограничением в C#
public class Response
{
public bool Success { get; private set; }
public static Response CreateErrorResponse()
{
return new Response { Success = false };
}
}
public interface ICommand<T> where T : Response
{
Task<T> ExecuteAsync();
}
public abstract CommandBase : ICommand<T> where T: Response
{
protected abstract Uri BuildUrl();
protected abstract Task<T> HandleResponseAsync();
public async override Task<T> ExecuteAsync()
{
var url = BuildUrl();
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
return await HandleResponseAsync(response);
}
}
Я хочу, чтобы обрабатывать любые исключения, которые могут быть отброшены в HTTPClient, поэтому я хочу, чтобы изменить CommandBase.ExecuteAsync на что-то вроде этого ...
public async override Task<T> ExecuteAsync()
{
var url = BuildUrl();
var httpClient = new HttpClient();
try
{
var response = await httpClient.GetAsync(url);
return await HandleResponseAsync(response);
}
catch (HttpRequestException hex)
{
return Response.CreateErrorResponse(); // doesn't compile
}
}
Ошибка компиляции, которую я получаю: «Невозможно преобразовать тип Response to async return type T». Я не могу использовать T.CreateErrorResponse()
, как указано in this question.
Как я могу обойти это?
Редактировать нижестоящие элементы: согласны ли вы с улавливанием исключений в библиотеке, подобной этому, вопрос все еще стоит!
Параметр 'CreateErrorResponse()' имеет Ty pe 'IResponse', но ожидаемый' Response'. –
@ Hamlet Typo! Исправлена. – rikkit
Какова идея этого? Вы могли бы просто позволить этому генерировать исключение, и оно будет автоматически объединено с awaiter. –