Каков наилучший способ конвертировать Action<T> в Func<T, Tres>?

У меня есть две функции в моем классе с этой подписью,

public static TResult Execute<TResult>(Func<T, TResult> remoteCall);
public static void Execute(Action<T> remoteCall)

Как передать один и тот же делегат во втором методе первому? Создание метода с аргументом Delegate не является способом, потому что я теряю некоторую информацию об исключениях
Большое спасибо!

2 ответа

Решение

Оберните это в делегате типа Func<T, TResult> с фиктивным возвращаемым значением, например

public static void Execute(Action<T> remoteCall)
{
    Execute(t => { remoteCall(t); return true; });
}

Вы буквально просите передать то, что не дает результата, функции, которая требует этого.
Это бессмысленно.

Вы можете легко конвертировать любую функцию формы Action<T> в Func<T,TResult> если вы готовы предоставить какое-либо значение результата (неявно или явно)

Func<T,TResult> MakeDefault<T,TResult>(Action<T> action)
{
    return t =>  { action(t); return default(TResult);}; 
}

или же

Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result)
{
    return t =>  { action(t); return result; };
}
Другие вопросы по тегам