2011-07-14 25 views
3

我經常最終編寫SubscribeToEvents()UnsubscribeEvents()函數,當屬性獲取新值時,在我的屬性設置器中調用該函數。雖然這樣做的代碼非常簡單,但我感覺沒有必要,因爲它基本上覆制了代碼(除了從+=-=以外代碼是相同的)。用於處理事件訂閱的實用類(AddSubscription()/ UnsubscribeAll())

我試圖創建一個由具有AddSubscription(EventHandler, EventHandler)功能和UnsubscribeAll()函數,用於清除由AddSubscription註冊的所有訂閱處理這個小工具類:

public class EventSubscriber 
{ 
    private readonly List<KeyValuePair<EventHandler, EventHandler>> _subscriptions = new List<KeyValuePair<EventHandler, EventHandler>>(); 

    public void AddSubscription(EventHandler toSubscribe, EventHandler subscriber) 
    { 
     toSubscribe += subscriber; 
     _subscriptions.Add(new KeyValuePair<EventHandler, EventHandler>(toSubscribe, subscriber)); 
    } 

    public void UnsubscribeAll() 
    { 
     foreach (KeyValuePair<EventHandler, EventHandler> subscription in _subscriptions) 
     { 
      EventHandler toSubscribe = subscription.Key; 
      EventHandler subscriber = subscription.Value; 
      toSubscribe -= subscriber; 
     } 
     _subscriptions.Clear(); 
    } 
} 

但是,我不能通事件中AddSubscription()

EventSubscriber subscriber = new eventSubscriber(); 
subscriber.AddSubscription(_someControl.SomeEvent, OnSomeEvent); 

這種失敗,錯誤

事件「......」只能出現在左手側+ =或 - =

有什麼方法可以讓我避免這種情況,還是我找錯了樹?

回答

1

正如我所看到的,如果沒有特殊的AddRemove方法來處理您的對象上的事件,那麼您運氣不好。正如你已經知道的那樣,你不能通過這個活動。
我的想法使用表達式樹也不管用,因爲你不準有任務在一個表達式樹...

如果您正在使用WPF並希望使用這個專門爲您的WPF控件的事件,你可以使用的方法AddHandlerRemoveHandler,以實現自己的目標,就像這樣:

public class EventSubscriber 
{ 
    private readonly List<Tuple<Control, RoutedEvent, Delegate>> 
     _subscriptions = 
      new List<Tuple<Control, RoutedEvent, Delegate>>(); 

    public void AddSubscription(Control control, RoutedEvent toSubscribe, 
           Delegate subscriber) 
    { 
     control.AddHandler(toSubscribe, subscriber); 
     _subscriptions.Add(Tuple.Create(control, toSubscribe, subscriber)); 
    } 

    public void UnsubscribeAll() 
    { 
     foreach (var subscription in _subscriptions) 
     { 
      subscription.Item1.RemoveHandler(subscription.Item2, 
              subscription.Item3); 
     } 
     _subscriptions.Clear(); 
    } 
} 

未經檢驗。

使用WinForms,你再次運氣不佳。

+0

我很高興這是可能的WPF。我使用WinForms,所以我運氣不佳,直到我們開始使用WPF – larsmoa