C#有哪些替代方法可以将事件传播到调用链中?

C#有哪些替代方法可以将事件传播到调用链中?,c#,events,chaining,C#,Events,Chaining,假设Main.cs调用sub.cs,后者调用action.csaction.cs引发并订阅sub.cs的事件,sub.cs不关心事件,只有main.cs想知道这一点,因此sub.cs再次引发事件,以便main.cs可以订阅它并发现action.cs引发了原始事件;看起来很麻烦 除了通过一系列方法调用传递事件,还有哪些替代方法?您可能希望在主题中使用pub-sub,例如,请参见 (您不需要rabbitmq,因为您可以自己实现简单的发布sub,也可以从github/MSDN获取一个发布sub,请参见

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


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

您可能希望在主题中使用pub-sub,例如,请参见


(您不需要rabbitmq,因为您可以自己实现简单的发布sub,也可以从github/MSDN获取一个发布sub,请参见:,)

您可以直接将
sub
中暴露的事件附加到
操作中暴露的事件,当然事件需要在
sub
操作中暴露:

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

    private ActionClass _action;
}
使用此解决方案,您仍然需要声明两次事件,但不链接方法调用,并且可以在
子类中省略事件处理程序

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


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

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

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; }
    }

    // ...
}