C# 用于处理事件订阅的实用程序类(AddSubscription()/UnsubscribeAll())
我经常编写C# 用于处理事件订阅的实用程序类(AddSubscription()/UnsubscribeAll()),c#,winforms,events,.net-3.5,event-handling,C#,Winforms,Events,.net 3.5,Event Handling,我经常编写SubscribeToEvents()和UnsubscribeEvents()函数,这些函数在属性获取新值时在属性设置器中调用。虽然执行此操作的代码非常简单,但我觉得它没有必要,因为它基本上重复了代码(除了+=和-=之外,代码是相同的) 我正试图创建一个小型实用程序类,通过使用AddSubscription(EventHandler,EventHandler)函数和UnsubscribeAll()函数来处理此问题,该函数清除由AddSubscription注册的所有订阅: public
SubscribeToEvents()
和UnsubscribeEvents()
函数,这些函数在属性获取新值时在属性设置器中调用。虽然执行此操作的代码非常简单,但我觉得它没有必要,因为它基本上重复了代码(除了+=
和-=
之外,代码是相同的)
我正试图创建一个小型实用程序类,通过使用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();
}
}
EventSubscriber subscriber = new eventSubscriber();
subscriber.AddSubscription(_someControl.SomeEvent, OnSomeEvent);
这会出错
事件“..”只能出现在+=或的左侧-=
我有什么办法可以避免这种情况,或者我找错了树吗?在我看来,如果对象上的事件没有特殊的
Add
和Remove
方法,你就不走运了。如您所知,您无法通过该活动。我使用表达式树的想法也行不通,因为不允许在表达式树中有赋值 如果您正在使用WPF并希望将其专门用于WPF控件的事件,则可以使用方法
AddHandler
和RemoveHandler
来实现您的目标,如下所示:
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();
}
}
公共类事件订阅服务器
{
专用只读列表
_订阅=
新列表();
公开作废添加订阅(控制、路由事件到订阅、,
代理订户)
{
AddHandler(toSubscribe,subscriber);
_subscriptions.Add(Tuple.Create(control,toSubscribe,subscriber));
}
公共无效取消订阅全部()
{
foreach(var订阅在_订阅中)
{
subscription.Item1.RemoveHandler(subscription.Item2,
认购(第3项);
}
_订阅。清除();
}
}
未经测试
使用WinForms,您又一次走运了。我很高兴WPF能做到这一点。不过我使用的是WinForms,所以在我们开始使用WPF之前,我运气不好