2011-08-30 58 views
2

我在c#中使用事件作爲發佈者/訂閱者模式。不過,我不知道我的程序將使用多少個發佈商。我想直接動態地將事件添加到類中,或者更加合理地將事件添加到包含事件的集合/字典中。事件收集

這兩種情況都可能使用C#嗎?

+1

你能發表一些代碼嗎? –

+1

可能重複的[在C#中的事件數組?](http://stackoverflow.com/questions/987050/array-of-events-in-c) –

+0

如果你在設計時不知道,那麼你不會在運行時也知道。我只能想象你倒退了,你不知道會有多少訂閱者參加一個活動。 –

回答

1

創建您的發佈者發佈並且您的訂閱者訂閱的介體。例如:

public class Mediator 
{ 
    public static readonly Mediator Current = new Mediator(); 
    public event EventHandler<EventArgs> EventRaised; 
    public void RaiseEvent(object sender, EventArgs eventArgs) 
    { 
     if (EventRaised!=null) 
      EventRaised(sender, eventArgs); 
    } 
} 
public class PublisherEventArgs : EventArgs 
{ 
    public string SomeData { get; set; } 
} 
public class Publisher 
{ 
    public void Publish(string data) 
    { 
     Mediator.Current.RaiseEvent(this, new PublisherEventArgs() { SomeData = data}); 
    } 
} 
public class Subscriber 
{ 
    public Subscriber() 
    { 
     Mediator.Current.EventRaised += HandlePublishedEvent; 
    } 

    private void HandlePublishedEvent(object sender, EventArgs e) 
    { 
     if(e is PublisherEventArgs) 
     { 
      string data = ((PublisherEventArgs)e).SomeData; 
      // todo: do something here 
     } 
    } 
} 

確保你對你的用戶實現IDisposable(它不是在我的例子),以便它在處置從中保退訂。

0

爲了做到這一點,您需要斷開該事件的來源。這通常通過事件聚合器完成;它管理想要發佈事件的客戶以及想要訂閱事件的客戶。所有這些將發佈者從聽衆中分離出來,並允許你做你正在描述的內容。

Prism has an event aggregator開箱即用,您可以使用IEventAggregator接口的形式。