使用传递的参数附加方法后分离事件处理程序

Tru*_*f42 1 c# parameter-passing event-handling

我需要将参数(在C#中)传递给事件处理程序,然后才能分离事件处理程序.

我附加事件处理程序并传递参数:

_map.MouseLeftButtonUp += (sender, e) => _map_MouseLeftButtonUp2(sender, e, showResultsWindow);
Run Code Online (Sandbox Code Playgroud)

该事件按预期调用.我尝试分离事件处理程序:

_map.MouseLeftButtonUp -= (sender, e) => _map_MouseLeftButtonUp2(sender, e, showResultsWindow);
Run Code Online (Sandbox Code Playgroud)

代码执行时没有错误,但似乎没有分离.

如果我以更传统的方式附加事件处理程序(不传递参数):

_map.MouseLeftButtonUp+=_map_MouseLeftButtonUp;
Run Code Online (Sandbox Code Playgroud)

和分离

_map.MouseLeftButtonUp -= _map_MouseLeftButtonUp;
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作

通过更传统的方式分离事件处理程序(带参数)

_map.MouseLeftButtonUp -= _map_MouseLeftButtonUp2;
Run Code Online (Sandbox Code Playgroud)

给我一个错误,说代表不匹配(这是有道理的)

所以我的问题是:为什么在传递参数时事件处理程序并没有真正被分离,并且有办法解决这个问题.

Wil*_*ins 5

当您创建lambda(匿名)函数时,您实际上每次都创建一个新函数.

你的前两行不起作用的原因是因为它们是两个完全不同的功能,它们碰巧做同样的事情.分离的正确方法是订阅和取消订阅功能,正如您已经想到的那样.

另一种可能不值得的方法是将lambda保存为变量.

Action<object, MouseButtonEventArgs> myEventMethod = (sender, e) => _map_MouseLeftButtonUp2(sender, e, showResultsWindow);
_map.MouseLeftButtonUp += myEventMethod;
// ...
_map.MouseLeftButtonUp -= myEventMethod;
Run Code Online (Sandbox Code Playgroud)