在 EventHandler 中使用 foreach 迭代器值 [重复]

Posted

技术标签:

【中文标题】在 EventHandler 中使用 foreach 迭代器值 [重复]【英文标题】:Using foreach iterator value inside EventHandler [duplicate] 【发布时间】:2014-06-27 00:38:16 【问题描述】:

我有一些类似于以下内容:

public class MyClass

    private List<MyOjectMapping> mappings;

    public void Start()
    
        foreach (var mapping in mappings)
        
            mapping.ObjectA.PropertyA.PropertyChanged += (s, e) =>
            
                // do something with mapping.ObjectB
            ;
        
    

    public void Stop()
    
        // unhook events
    


public class MyObject : INotifyPropertyChanged

    public object PropertyA;
    public object PropertyB;


public class MyOjectMapping

    public object SomeSortOfKey;
    public MyObject ObjectA;
    public MyObject ObjectB;

如您所见,我正在尝试对 lambda 事件处理程序中的 foreach 迭代器执行一些操作。这行得通,但是这样做,我不知道如何在 Stop() 方法中解开事件。

我应该如何去连接 PropertyChanged 事件,以便我以后可以取消它并仍然访问 foreach 迭代器?

谢谢

【问题讨论】:

它类似于那个问题,但不同之处在于我将事件连接到一个循环中并希望使用迭代器值。 这有什么不同?答案是您必须存储委托并稍后将其删除。就是这样。 @Sriram:嗯,你实际上需要存储(至少)一对Tuple&lt;INotifyPropertyChanged, PropertyChangedEventHandler&gt;,或者(更一般地)一个分离代表列表。 【参考方案1】:

如果您想使用多个匿名事件处理程序并且以后仍然能够分离它们,您可以简单地将分离操作存储在单独的列表中,类似于:

// these actions should be invoked during cleanup
private readonly List<Action> _cleanupActions = new List<Action>();

public void Start()

    foreach (var m in mappings)
    
        // you need both closures in order to reference them inside
        // the cleanup action
        var mapping = m;
        PropertyChangedEventHandler handler = (s, e) =>  /* ... */ ;

        // attach now
        mapping.PropertyChanged += handler;

        // add a cleanup action to detach later
        _cleanupActions.Add(() => mapping.PropertyChanged -= handler);



public void Stop()

    // invoke all cleanup actions
    foreach (var action in _cleanupActions)
        action();

这很简洁,因为它允许任意复杂的清理操作,并且它捕获正确的对象对及其事件处理程序。

【讨论】:

我喜欢它——漂亮又整洁!谢谢 尽管这是重复的问题,但这个答案值得一票。 +1 聪明。

以上是关于在 EventHandler 中使用 foreach 迭代器值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

线程间通信-使用EventHandler下载网络图片

事件委托 EventHandler

为 UIBarButtonItem 添加/删除 EventHandler

如何将按钮的索引传递给 EventHandler?

event & EventHandler

event & EventHandler