在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迭代器?
谢谢
如果您想使用多个匿名事件处理程序,并且以后仍然能够分离它们,您可以简单地将分离操作存储在单独的列表中,类似于:
// 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();
}
这很简洁,因为它允许任意复杂的清理操作,并且它捕获正确的对象对及其事件处理程序。