J'apprends la pile d'API Web et j'essaie d'encapsuler toutes les données sous la forme d'un objet "Résultat" avec des paramètres tels que Success et ErrorCodes.
Cependant, différentes méthodes produiraient des résultats et des codes d'erreur différents, mais l'objet de résultat serait généralement instancié de la même manière.
Pour gagner un peu de temps et en savoir plus sur les fonctionnalités asynchrones/wait en C #, j'essaie d'envelopper tous les corps de méthodes de mes actions de l'API Web dans un délégué d'action asynchrone, mais je me suis retrouvé pris au piège ...
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;
}
}
}
Je veux écrire une méthode qui effectue une action sur un objet Result et le renvoyer. Normalement, par des méthodes synchrones, il serait
public T DoSomethingAsync<T>(Action<T> resultBody) where T : Result, new()
{
T result = new T();
resultBody(result);
return result;
}
Mais comment transformer cette méthode en une méthode asynchrone utilisant async/wait?
C'est ce que j'ai essayé:
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?
}
L'équivalent async
de Action<T>
est Func<T, Task>
, alors je crois que c'est ce que vous cherchez:
public async Task<T> DoSomethingAsync<T>(Func<T, Task> resultBody)
where T : Result, new()
{
T result = new T();
await resultBody(result);
return result;
}