【发布时间】:2020-11-11 04:11:52
【问题描述】:
我有一个对象列表,我想为每个对象订阅/取消订阅一个事件(通过委托,因为我需要向方法传递额外的参数)。 所以我有这样的事情:
public void MonitoringCtrl(bool monitoringOn)
{
foreach (var mh in monHandlers)
{
evHandler = (sender, e) => OnNotification(sender, e, mh);
if (monitoringOn)
{
//subscribe to event
mh.monitoredItem.Notification += evHandler;
}
else
{
//unsubscribe
mh.monitoredItem.Notification -= evHandler;
}
}
//do other stuff
}
这在订阅时有效,但在取消订阅时不起作用,大概是因为我在 foreach 中重新声明了 evHandler。如何保存对 evHandler 的引用?
【问题讨论】:
-
你可以把你的 lambda 变成一个真正的方法。或者将您的 lamda 存储为班级成员。
-
网站上已经有很多关于这种一般情况的问答。您将无法遵循命名方法方法,因为您依赖于捕获的
mh值。因此,您将不得不使用其中一种替代方法,例如将委托实例保存在某处,或从sender检索mh值(例如,如果您有一些从monitoredItem到mh对象的映射持有该参考)。实际上,如果你能做到后者,那么命名方法将起作用。
标签: c# event-handling