C#有什么替代方法可以将一个事件传播到一个调用链中?

时间:2016-01-25 07:30:37

标签: c# events chaining

想象一下Main.c调用sub.cs来调用action.csaction.cs sub.cs提出的sub.cs提出和事件main.cs并不关心只有sub.cs想要了解此事件的事件main.cs再次引发事件,以便action.cs可以订阅它并发现string tmp = "abacus"; char *new = tmp.c_str(); 已经提出了原始事件;这看起来很麻烦。

通过一系列方法调用传递事件有哪些替代方法?

3 个答案:

答案 0 :(得分:2)

您可以在Sub中公开的事件中直接附加Action中公开的事件,当然事件需要在SubAction中公开:

class SubClass
{
    public event EventHandler MyEvent
    {
        add
        {
            _action.MyEvent += value;
        }
        remove
        {
            _action.MyEvent -= value;
        }
    }

    private ActionClass _action;
}

使用此解决方案,您仍然需要声明事件两次但不链接方法调用,并且可以省略SubClass中的事件处理程序。

当然,还有其他选择,但您可能需要更改设计,而我没有足够的背景来提出任何建议。总的来说,我从最简单的解决方案开始。如果您只需要冒泡一个事件,这可能就足够了,但如果您需要公开其中的许多事件,那么您可以考虑引入第三个对象,该对象公开您需要的内容并通过{{1}进行访问来自SubClass,类似这样的事情(但请更好的名字):

ActionClass

请注意,此示例只是概念验证。

答案 1 :(得分:1)

您可能希望将pub-sub与主题一起使用,例如,请参阅https://www.rabbitmq.com/tutorials/tutorial-three-dotnet.html

(你不需要rabbitmq,因为你可以自己实现简单的pub-sub或从github / MSDN获取一个:https://msdn.microsoft.com/en-us/library/ms752254(v=vs.110).aspxhttps://github.com/upta/pubsub/blob/master/README.md

答案 2 :(得分:0)

您可以使用回调代替事件 您可以添加回调函数作为方法链方法的附加参数 例如。如果方法为MyData,则将其替换为doSomething(),Main.c使用doSomething(Action action)调用此方法,并且Action.cs调用Sub.doSomething(() => ReactToTheEvent());引发事件。