【问题标题】:Using foreach iterator value inside EventHandler [duplicate]在 EventHandler 中使用 foreach 迭代器值 [重复]
【发布时间】: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;,或者(更一般地)一个分离代表列表。

标签: c# eventhandler


【解决方案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 聪明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 2011-02-28
  • 2013-11-25
  • 2012-03-23
  • 2018-11-01
  • 2012-12-08
  • 2013-08-01
相关资源
最近更新 更多