Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换动作的最佳方式是什么<;T>;to Func<;T、 Tres>;?_C#_.net_Delegates - Fatal编程技术网

C# 转换动作的最佳方式是什么<;T>;to Func<;T、 Tres>;?

C# 转换动作的最佳方式是什么<;T>;to Func<;T、 Tres>;?,c#,.net,delegates,C#,.net,Delegates,我的类中有两个函数有这个签名 public static TResult Execute<TResult>(Func<T, TResult> remoteCall); public static void Execute(Action<T> remoteCall) publicstatictresult执行(Func-remoteCall); 公共静态无效执行(操作远程调用) 如何将第二个方法中的同一委托传递给第一个方法?使用委托参数创建方法不是一种方法,

我的类中有两个函数有这个签名

public static TResult Execute<TResult>(Func<T, TResult> remoteCall);
public static void Execute(Action<T> remoteCall)
publicstatictresult执行(Func-remoteCall);
公共静态无效执行(操作远程调用)

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

将其包装在带有伪返回值的
Func
类型的委托中,例如

public static void Execute(Action<T> remoteCall)
{
    Execute(t => { remoteCall(t); return true; });
}
publicstaticvoidexecute(actionremotecall)
{
执行(t=>{remoteCall(t);返回true;});
}

您实际上是要求将不提供结果的内容传递给需要它的函数。
这是荒谬的

如果您愿意提供一些结果值(隐式或显式),则可以轻松地将任何形式的函数
Action
转换为
Func

Func MakeDefault(操作)
{
返回t=>{action(t);返回default(TResult);};
}

Func MakeFixed(操作、结果)
{
返回t=>{action(t);返回结果;};
}

仅从C#的角度来看,这是“荒谬的”。有一些语言可以优雅地处理空白。需要注意的是,这是在权衡代码重用和额外实例,因为lambda正在对remoteCall参数进行闭包。
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; };
}