当方法包含'ref'参数时,创建委托的最简单方法是什么?

3

我们假设我有这样一个方法:

public static object CallMethod(Delegate method, params object[] args)
{
    //more logic
    return method.DynamicInvoke(args);
}

以下内容对于大多数情况都能正常工作,可以像下面这样调用(简单示例):

Delegate methodCall = new Func<decimal,decimal>(Math.Ceiling);
object callResult = CallMethod(methodCall, myNumber);

然而,我遇到了这样一种情况:我需要在一个带有“ref”参数(WCF服务调用)的方法中使用它,但Func类无法处理。

Delegate methodCall =
    new Func<MyService.InputClass, MyService.CallResult>(service.DoWork);

由于我没有处理委托的经验,请问创建一个传递给我的方法的委托,最简单的方法是什么?


重写这个方法,使其不再有 ref 参数? - dtb
@dtb - 我希望有一种比将服务生成的包装器包装在自定义函数中更简单的方法来解决这个问题。 - John
请查看https://dev59.com/91TTa4cB1Zd3GeqPw-gq了解为什么不允许使用ref关键字作为输入参数,并查看https://dev59.com/I3M_5IYBdhLWcg3wq1CF以获取可能的解决方案。 - dash
我真的看不到任何可行的方法来实现这一点,同时保持方法签名中的“ref”并使用您的CallMethod方法。总的来说,任何“ref”值都将变得无意义,因为您无法从CallMethod方法中传回ref'd值。 - doogle
或者声明一个自定义的委托类型。如果你使用 params 数组动态调用它,可能会得到令人惊讶的结果(它会改变数组中的值,但不会改变你从哪里调用它的位置)。 - Random832
1个回答

0

这不是我的应用程序,所以我没有简单的测试方法(我只是被问到是否知道解决问题的方法),但这看起来应该可以工作吗?

Delegate methodCall = new Func<MyService.CallResult>(delegate() { return service.DoWork(ref myInput)});
object callResult = CallMethod(methodCall, null);

为什么应用程序的所有者不在这里提出问题? - Adam Ralph
@AdamRalph - 他还没有领悟 StackOverflow 的方式。另外,我收到了一封回复电子邮件,说这确实起作用了;ref 变量也没有问题(它被正确更新了)。 - John
很高兴听到这个消息。至于SO,也许你应该启发他 ;-) - Adam Ralph

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