繁体   English   中英

将方法附加到C#中的事件时如何传递参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM