Каков наилучший способ конвертировать 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; };
}