在EventHandler中使用foreach迭代器值

本文关键字:foreach 迭代器 EventHandler | 更新日期: 2023-09-27 18:02:36

我有一些类似于下面的东西:

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迭代器?

谢谢

在EventHandler中使用foreach迭代器值

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

// 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();
}

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