1. ホーム
  2. c#

[解決済み] 非同期アクションのデリゲートメソッドはどのように実装するのですか?

2022-04-25 09:09:36

質問

背景を少し教えてください。

私はWeb APIスタックを学習しており、すべてのデータを"の形でカプセル化しようとしています。 Result のようなパラメータを持つオブジェクトです。 SuccessErrorCodes .

しかし、異なるメソッドは異なる結果とエラーコードを生成しますが、結果オブジェクトは一般的に同じ方法でインスタンス化されます。

時間を節約するため、また async / await C#の能力で、Web APIアクションのすべてのメソッドボディを非同期アクションデリゲートにラップしようとしているのですが、ちょっとしたつまづきに遭遇しました。

次のようなクラスがあるとする。

public class Result
{
    public bool Success { get; set; }
    public List<int> ErrorCodes{ get; set; }
}

public async Task<Result> GetResultAsync()
{
    return await DoSomethingAsync<Result>(result =>
    {
        // Do something here
        result.Success = true;
        
        if (SomethingIsTrue)
        {
            result.ErrorCodes.Add(404);
            result.Success = false;
        }
    }
}

に対してアクションを実行するメソッドを書きたい。 Result オブジェクトを作成し、それを返します。通常、synchronousメソッドでは、以下のようになります。

public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
    T result = new T();
    resultBody(result);
    return result;
}

しかし、このメソッドを非同期メソッドに変換するためには async / await ?

これは私が試したものです。

public async Task<T> DoSomethingAsync<T>(Action<T, Task> resultBody) 
    where T: Result, new()
{
    // But I don't know what do do from here.
    // What do I await?
}

解決方法は?

その async に相当します。 Action<T>Func<T, Task> ということで、お探しのものはこれだと思います。

public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
    where T : Result, new()
{
  T result = new T();
  await resultBody(result);
  return result;
}