将Action <t>转换为Func <t,tres>的最佳方法是什么?</t,tres> </t>

时间:2009-06-03 10:03:43

标签: c# .net delegates

我的课程中有两个带有此签名的函数,

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

如何将第二种方法中的同一委托传递给第一种方法?使用Delegate参数创建方法不是一种方法,因为我正在丢失一些异常信息。非常感谢!

2 个答案:

答案 0 :(得分:34)

将其包含在具有虚拟返回值的Func<T, TResult>类型的委托中,例如

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

答案 1 :(得分:8)

你要求字面意思是将一些不能提供结果的东西传递给需要它的函数 这是荒谬的。

如果您愿意提供某些结果值(隐式或显式),您可以轻松地将表单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; };
}