活动 - 发布和发布订阅

时间:2015-06-03 13:24:07

标签: c# events delegates

假设我有一个有静态事件的类。此活动由三个或更多不同的类订阅。 [让我们说4]

现在当一些值得注意的事情发生时,课堂上的事件被提升了。

当4个不同的类订阅该事件时,它们中的相应处理程序执行它们各自的代码。

现在,如果我不想要我的班级的处理程序代码3& 4执行。我该怎么办?

请帮忙。 在此先感谢!

1 个答案:

答案 0 :(得分:0)

您希望处理程序在什么条件下开火?

您可以使用以下模式,该模式将提供一种机制来防止处理程序根据唯一标识符触发。

在这个例子中,我创建了一些简单的事件参数,事件将用于告诉处理程序一个唯一的标识符(Guid):

public class MyEventArgs : EventArgs { public Guid Identifier { get; set; } }

然后,创建一个简单的类来引发事件:

public class EventGenerator
{
    public EventHandler<MyEventArgs> TheEvent;

    public void RaiseEvent(Guid identifier)
    {
        if (TheEvent != null) 
            TheEvent(this, new MyEventArgs(){Identifier = identifier});
    }
}

最后,您可以拥有一个类(任意数量的这些),它们都将订阅该事件,但只会在事件args提供不同的标识符时运行它:

public class TheClass
{
    private readonly Guid _identifier;
    private EventGenerator _eventGenerator;

    // The constructor is given the event generator class instance
    public TheClass(EventGenerator evGen)
    {
        // create a unique identifier for the class
        _identifier = Guid.NewGuid();

        // subscribe to the event
        _eventGenerator = evGen;
        _eventGenerator.TheEvent += TheEvent;
    }

    private void TheEvent(object sender, MyEventArgs e)
    {
        // when the event fires, check the Guid and if it isn't a match, don't continue ...
        if (e.Identifier == _identifier) return;

        // rest of the handler goes here ...
    }
}

然而,这只是一个例子 - 你可能需要一些不同的东西,只需在选择时取消订阅该事件即可实现。这取决于我最初问题的答案。