取り組んでいるプロジェクトにコマンド パターンを実装しました。これはほとんど現在の構造です。
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 型を非同期戻り型 T に変換できません」です。この質問でT.CreateErrorResponse()
概説されているように、私は使用できません。
どうすればこれを回避できますか?
反対票を投じる人への編集: このようなライブラリで例外をキャッチすることに同意するかどうかに関係なく、問題は解決しません!