Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于处理事件订阅的实用程序类(AddSubscription()/UnsubscribeAll())_C#_Winforms_Events_.net 3.5_Event Handling - Fatal编程技术网

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之前,我运气不好