[英]how do I pass parameters when attaching a method to an event in c#
我想参数发送到这是由一个事件附加事件侦听器时调用的方法,我可以创造一个正常工作的匿名方法的参数,但是我会在理想情况下一样,使其更加简洁,如下面的例子中,这是抛出以下编译器错误:
运算符'+ ='不能应用于类型'System.EventHandler'和'void'的操作数
ConfigFileWritten += (sender, args) =>
{
string prefix = "IFMDE";
bool enabled = true;
SetConfigInterfaceEnabled(prefix, enabled);
};
//this line is throwing a compiler error
ConfigFileWritten += SetConfigInterfaceEnabled("",true);
是否有可能refacor中的代码,我的建议?
不是这样的。 您正在执行的操作试图将调用 SetConfigInterfaceEnabled
的结果附加为事件处理程序,这当然是不可能的(结果必须是EventHandler
委托,但这只是void
)。
你能做的是
ConfigFileWritten += (s, e) => SetConfigInterfaceEnabled("",true);
在这里,事件处理程序是具有适当签名(带有两个隐式类型的参数)的lambda函数,该签名进而调用SetConfigInterfaceEnabled
。 其唯一目的是使SetConfigInterfaceEnabled
的签名适应预期的EventHandler
。
为了完整起见,我应该提到,尽管这样做很不常见,但是如果SetConfigInterfaceEnabled
是创建委托的工厂方法,则可以采用您建议的语法:
EventHandler SetConfigInterfaceEnabledDelegate(string s, bool b)
{
return (o, e) => SetConfigInterfaceEnabled(s, b);
}
ConfigFileWritten += SetConfigInterfaceEnabledDelegate("", true);
通过不为按值传递的参数使用变量,可以使其更加简洁,如下所示:
ConfigFileWritten += (sender, args) => {
SetConfigInterfaceEnabled("IFMDE", true);
};
当编译器看到以上内容时,它不会立即调用SetConfigInterfaceEnabled
。 而是,它创建一个可以在运行时调用的对象,这样,当您调用它时,就会调用SetConfigInterfaceEnabled
。 换句话说, =>
创建一个委托,使您可以推迟对SetConfigInterfaceEnabled
的调用。
但是,当编译器看到此内容时
ConfigFileWritten += SetConfigInterfaceEnabled("IFMDE", true);
它将其解释为立即调用SetConfigInterfaceEnabled
的指令,并将从其返回的委托用作事件处理程序。 当然这是不可能的,因为SetConfigInterfaceEnabled
不会返回委托。
如果ConfigFileWritten
事件处理程序为您自己的类型,则在发生事件时可以传递argumemns。 从EventArgs
派生您自己的事件参数类型并传递参数。 它可以为您提供更大的灵活性,并且您不必在事件处理程序中对参数进行硬编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.