Консолидация функций, получающих параметр функции

#c# #.net-core

Вопрос:

У меня есть следующие функции:

 public static async Task<MyReturnType> MyFunction(Func<MyReturnType> func)
{
    // do stuff
    while (/* some conditions */)
    {
        var myReturn = func();
        // do stuff
    }
    // do stuff
}

public static async Task<MyReturnType> MyFunction(Func<Task<MyReturnType>> func)
{
    // do stuff
    while (/* some conditions */)
    {
        var myReturn = await func();
        // do stuff
    }
    // do stuff
}
 

Как вы можете видеть, эти 2 функции идентичны, за исключением того, что переданная функция вызывается по-разному. Есть ли способ объединить эти 2 функции в 1, чтобы мне не приходилось дублировать другой код?

Ответ №1:

Вы можете полностью удалить первую перегрузку и всякий раз, когда захотите вызвать первую перегрузку, например

 await MyFunction(() => new MyReturnType());
 

Вы можете использовать Task.FromResult для обертывания MyReturnType в Task<MyReturnTask> :

 await MyFunction(() => Task.FromResult(new MyReturnType()));
 

FromResult дает вам выполненную задачу, поэтому await func() не делает никакого ожидания и оценивает результат синхронно, аналогично тому, что происходит при первой перегрузке.

Хотя я бы предпочел сохранить первую перегрузку и вызвать вторую перегрузку:

 public static Task<MyReturnType> MyFunction(Func<MyReturnType> func)
    => MyFunction(() => Task.FromResult(func()))