C# 如何使用使用使用lambda表达式创建的相同事件处理程序订阅两个不同的事件?

C# 如何使用使用使用lambda表达式创建的相同事件处理程序订阅两个不同的事件?,c#,lambda,combobox,event-handling,C#,Lambda,Combobox,Event Handling,关于我以前的问题 我现在有一个稍微不同的需求。 我必须使用相同的lambda操作订阅不同类型的事件: EventHandler action = (sender2,args) => { var cmbChanged = sender2 as ComboBox; //...check... }; cmb.DropDownClosed += action; cmb.PreviewKeyUp += action; // <----- compiler error he

关于我以前的问题

我现在有一个稍微不同的需求。 我必须使用相同的lambda操作订阅不同类型的事件:

EventHandler action = (sender2,args) =>
{
    var cmbChanged = sender2 as ComboBox;
    //...check...
};


cmb.DropDownClosed += action;
cmb.PreviewKeyUp += action; // <----- compiler error here
EventHandler操作=(发送者2,参数)=>
{
var cmbChanged=sender2作为组合框;
//…检查。。。
};
cmb.DropDownClosed+=操作;

cmb.PreviewKeyUp+=操作;// 由于委托类型不同,因此不能直接分配和添加它。但您可以通过以下方式转发:

cmb.DropDownClosed += action;
cmb.PreviewKeyUp += (sender, e) => action(sender, e);

由于
e
的类型为
KeyEventArgs
,该类型派生自
EventArgs
,因此可以将其传递给
action

,因为代理类型不同,所以不能直接分配和添加它。但您可以通过以下方式转发:

cmb.DropDownClosed += action;
cmb.PreviewKeyUp += (sender, e) => action(sender, e);

由于
e
属于从
EventArgs
派生的
KeyEventArgs
类型,因此可以将其传递给
action

您可以将lambda表达式中的代码移动到单独的方法,并在每个事件句柄中调用该方法。您可以将lambda表达式中的代码移动到单独的方法并在每个事件句柄中调用该方法非常感谢!!快速、干净、简单和有效的奇迹!!“分配”在技术上不是100%正确的,我们谈论的是事件订阅。虽然这本身是一个“加法赋值”操作符,但它对事件的意义与简单赋值略有不同。非常感谢!!快速、干净、简单和有效的奇迹!!“分配”在技术上不是100%正确的,我们谈论的是事件订阅。虽然这本身是一个“加法赋值”操作符,但它对事件的意义与简单赋值稍有不同。