【问题标题】:C# What alternative ways are there to propagate an Event down a call chain?C# 有哪些替代方法可以将事件沿调用链传播?
【发布时间】:2016-01-25 07:30:36
【问题描述】:

假设Main.cs 调用sub.cs,后者调用action.csaction.cs 引发和sub.cs 订阅的事件,但是,sub.cs 不关心事件它只有 main.cs 想知道这一点所以sub.cs 再次引发事件以便main.cs 可以订阅它,发现action.cs 引发了原始事件;这看起来很麻烦。

除了通过方法调用链传递事件之外,还有哪些替代方法?

【问题讨论】:

    标签: c# events chaining


    【解决方案1】:

    你可以直接将Sub暴露的事件附加到Action暴露的事件上,当然事件需要同时暴露在SubAction

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

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

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

    public sealed class Notifications
    {
        public event EventHandler MyEvent;
    
        internal void RaiseMyEvent(EventArgs e)
        {
            var myEvent = MyEvent;
            if (myEvent != null)
                myEvent(this, e);
        }
    }
    
    class MyAction
    {
        public Notifications Notifications
        {
            get { return _notifications; }
        }
    
        // ...
    }
    
    class SubClass
    {
        public Notifications Notifications
        {
            get { return _action.Notifications; }
        }
    
        // ...
    }
    

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

    【讨论】:

      【解决方案2】:

      您可能希望将 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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-19
          • 1970-01-01
          • 2020-10-13
          • 1970-01-01
          • 2014-08-08
          • 2019-12-06
          • 2016-06-03
          • 2021-03-25
          相关资源
          最近更新 更多