将Action<T>转换为Func<T, Tres>的最佳方法是什么?

24

我的类中有两个函数,其签名如下:

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

如何将第二个方法中的相同委托传递给第一个方法?使用带有Delegate参数的方法不是一种方法,因为我会丢失一些异常信息。
2个回答

43

将其包装在类型为 Func<T, TResult> 的委托中,并使用虚拟返回值,例如:

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

需要注意的是,这里在权衡代码重用和由于 lambda 对 remoteCall 参数所做的闭包而产生的额外实例之间进行交易。 - eglasius

9
您正在要求将没有结果的内容传递给需要结果的函数,这是没有意义的。
如果您愿意提供一些结果值(无论是隐式还是显式),则可以轻松地将任何Form 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; };
}

2
从C#的角度来看,这是“无意义的”。有一些语言可以优雅地处理void。 - Andrzej Martyna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接