c#如何修改通过委托的参数

时间:2017-10-15 06:59:58

标签: c# delegates pass-by-reference

我有以下代表

System.Action<SomeMessage> TheDelegate;

其中有几个订阅者,但是当消息通过所有订阅者时,每个订阅者都会对其执行某些操作,并且该更改会持续存在并传递给下一个订阅者,这是我不想要的。< / p>

有没有办法可以将原始邮件用作所有订阅者的参数?

编辑: SomeMessage是一个类,因此它通过订阅者

通过引用传递

1 个答案:

答案 0 :(得分:0)

列举两种可能性:

  • 每次将邮件传递给订阅者时都要克隆邮件。如何构建消息,克隆是否便宜?也许你甚至可以把它传递给struct?克隆可以通过实现ICloneable来完成,基于每个属性进行克隆,这可以通过框架自动化,例如Automapper(http://automapper.org),或者,如果你搞砸了一些像JSON这样的JSON Lib .NET,您可以执行var clone = FromJson(ToJson(original))之类的操作。这肯定不是一种快速的方法,而是一种适用于深层物体的简单方法。

  • 另一种方法是让邮件本身不可变,让每个订阅者将更改请求传递给某种收集器,例如

像这样:

interface ICommandSequence
{
    void AddCommand(ICommand);
}

并且Action变为

System.Action<ImmutableMessage, ICommandSequence>

现在,每个订阅者都可以将命令实例传递给ICommandSequence实例。在调用所有订阅者之后,您可以执行命令序列,并将更改应用于消息对象。命令的外观取决于消息和消息处理的外观。

如果您的应用程序关注的是专注于业务领域的设计,那么您可以构建代表真实业务事件的命令,例如在CQRS中完成。