Я хочу наоборот, не меняя порядок вызова.
Это невозможно, поскольку язык C # поддерживает только методы расширения для типов , а не методы .
Ближайший метод, который вы можете получить, - это метод расширения для делегатов:
public static async Task<T> WithDelay<T>(this Func<Task<T>> func, int delay) {
await Task.Delay(delay);
return await func();
}
Использование по-прежнему оказывается неудобным:
// Either:
Func<Task<MyType>> func = MyMethod;
var result = await func.WithDelay(1000);
// or (assuming "using static"):
var result = await WithDelay(MyMethod, 1000);
// What you really want, not currently possible:
// var result = await MyMethod.WithDelay(1000);
В подобных ситуациях, связанных с типами, сначала можно решить проблему синхронно, а затем преобразовать это решение в async
.Если язык препятствует хорошему синхронному решению, то он, скорее всего, помешает хорошему асинхронному решению.
Существует предложение для методов расширения методов, но сегодня оно не является частью языка.