gpt4 book ai didi

c# - 用于处理事件订阅的实用程序类 (AddSubscription()/UnsubscribeAll())

转载 作者:行者123 更新时间:2023-11-30 18:03:56 24 4
gpt4 key购买 nike

我经常最终会编写 SubscribeToEvents()UnsubscribeEvents() 函数,当属性获得新值时,它们会在我的属性 setter 中调用。尽管执行此操作的代码非常简单,但我觉得没有必要,因为它基本上是重复代码(代码是相同的,除了 +=-=)。

我正在尝试创建一个小型实用程序类来处理此问题,方法是使用一个 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);

失败并出现错误

The event '....' can only appear on the left hand side of += or -=

有什么办法可以避免这种情况,还是我找错了树?

最佳答案

在我看来,如果您的对象上的事件没有特殊的 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,你又倒霉了。

关于c# - 用于处理事件订阅的实用程序类 (AddSubscription()/UnsubscribeAll()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6689775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com