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

Ars*_*yan 19 .net c# delegates

我的班上有两个带有这个签名的函数,

public static TResult Execute<TResult>(Func<T, TResult> remoteCall);
public static void Execute(Action<T> remoteCall)
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ech 37

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

public static void Execute(Action<T> remoteCall)
{
    Execute(t => { remoteCall(t); return true; });
}
Run Code Online (Sandbox Code Playgroud)


Shu*_*oUk 8

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

你可以很容易地转换表的任何功能Action<T>Func<T,TResult>,如果你愿意提供一些结果值(隐或显式)

Func<T,TResult> MakeDefault<T,TResult>(Action<T> action)
{
    return t =>  { action(t); return default(TResult);}; 
}
Run Code Online (Sandbox Code Playgroud)

要么

Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result)
{
    return t =>  { action(t); return result; };
}
Run Code Online (Sandbox Code Playgroud)

  • 仅从C#角度来看这是“荒谬的”。有些语言可以优雅地处理空隙。 (2认同)