C# 重写lambda扩展方法
我已经创建了一个扩展方法,它的工作方式和我想要的一样。我注意到,C# 重写lambda扩展方法,c#,event-handling,lambda,extension-methods,C#,Event Handling,Lambda,Extension Methods,我已经创建了一个扩展方法,它的工作方式和我想要的一样。我注意到,party和property参数以某种方式被“复制”到lambda表达式中。这样,我就不需要维护编辑器/参与方/属性关联的自定义列表 但是,我需要重置ButtonEdit的ButtonClick事件。因为这个是匿名的,所以我也不能使用-=操作符 所以,我的问题是-我如何重写这个方法以便删除委托?或者,我可以使用其他哪种方法来处理带有额外参数的特定事件处理程序(例如party和property) 谢谢,, 斯特凡 然后像这样使用它:
party
和property
参数以某种方式被“复制”到lambda表达式中。这样,我就不需要维护编辑器/参与方/属性关联的自定义列表
但是,我需要重置ButtonEdit的ButtonClick事件。因为这个是匿名的,所以我也不能使用-=操作符
所以,我的问题是-我如何重写这个方法以便删除委托?或者,我可以使用其他哪种方法来处理带有额外参数的特定事件处理程序(例如party
和property
)
谢谢,,
斯特凡
然后像这样使用它:
var handler = new MyEventHandler(party,property,editor);
editor.ButtonClick += handler.Handler;
我不确定这对您有多大帮助,因为我无法100%理解您试图解决的问题。因此我需要在内部存储一个ButtonEdit/操作关联列表?我不知道您试图从何处删除操作,因此我无法真正帮助您删除它。是否尝试在另一个单击处理程序中删除它?我在重新绑定窗体上的控件之前删除事件处理程序。如果我不重置已处置对象,事件处理程序将引用该对象。不过你的选择2看起来很有趣。这种方法有名称吗?在选项1中,事件必须在处理程序内部取消订阅,否则事件几乎不会触发。。。这些天我问了一个类似的问题:恐怕我还没有看到任何地方记录了选项2。选项1实际上是一个部分代码示例,它只显示了机制,但需要将事件setter和de setter分开。
Action<object,EventArgs> myaction = (sender, e) =>
{
party.ShowAddressLookupDialog(property);
editor.SetAddressDisplayText(party, property);
};
editor.ButtonClick += myaction;
editor.ButtonClick -= myaction;
class MyEventHandler
{
... _property;
... _party;
... _editor;
public MyEventHandler(... property, ... party, ... editor)
{
_property = property;
_party = party;
_editor = editor;
}
public void Handler(object sender, EventArgs e)
{
_party.ShowAddressLookupDialog(_property);
_editor.SetAddressDisplayText(_party, _property);
}
}
var handler = new MyEventHandler(party,property,editor);
editor.ButtonClick += handler.Handler;