Web APIスタックを学習しており、SuccessやErrorCodesなどのパラメーターを使用して、すべてのデータを「結果」オブジェクトの形式でカプセル化しようとしています。
ただし、異なるメソッドは異なる結果とエラーコードを生成しますが、結果オブジェクトは通常同じ方法でインスタンス化されます。
時間を節約し、C#のasync/await機能について詳しく知るために、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オブジェクトに対してアクションを実行し、それを返すメソッドを作成したいと思います。通常、同期メソッドを介して
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;
}