2011-07-14 27 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