2015-06-03 212 views
0

可以说我有一个类中有一个静态事件。此活动由三个或更多不同的类别订阅。 [可以说4]事件 - 发布和订阅

现在,当有什么值得注意的事情发生在课堂上的事件得到提升。

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

现在,如果我不想让我的班级的处理程序代码执行3 & 4。我需要做什么?

请帮忙。 在此先感谢!

+2

如果您不希望这些处理程序执行,他们为什么订阅?你怎么知道哪些处理程序不执行?目前你的问题还不清楚。 –

+0

如果您公开了该活动,则可以在其他班级中重复使用该活动 – Kyra

+2

这不适用于活动模式。您最好创建订阅者注册代理的订阅系统(几乎像是一个事件),但发布者可以逐个浏览订阅者并决定致电该代理。这与多播代表有所不同,因为您不会像事件那样将它们组合成一个。 –

回答

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

最后,你可以有一个类(任意数量的这些),将所有订阅的事件,但将只运行它时,事件参数提供不同的标识符:

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

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

+0

谢谢你帮我解决这个问题。 – Deepanshu