-1

我正在尝试将参数发送到在附加事件侦听器时由事件调用的方法,我可以在匿名方法中创建参数,该方法可以正常工作但是我理想情况下希望使其更简洁,如下例所示,这个引发以下编译器错误:

运算符“+=”不能应用于“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);

是否可以按照我的建议重构代码?

4

3 回答 3

4

不是这样的。您在那里所做的是尝试将调用结果 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);
于 2013-04-24T10:09:27.673 回答
1

您可以通过不为按值传递的参数使用变量来使其更简洁,如下所示:

ConfigFileWritten += (sender, args) => {
    SetConfigInterfaceEnabled("IFMDE", true);
};

当编译器看到上述内容时,它不会立即调用SetConfigInterfaceEnabled。相反,它创建了一个可以在运行时调用的对象,这样当你调用它时,就会调用它SetConfigInterfaceEnabled。换句话说,=>创建一个委托,让您推迟对 的调用SetConfigInterfaceEnabled

然而,当编译器看到这个

ConfigFileWritten += SetConfigInterfaceEnabled("IFMDE", true);

它将其解释为SetConfigInterfaceEnabled 立即调用的指令,并使用从它返回的委托作为事件处理程序。当然这是不可能的,因为SetConfigInterfaceEnabled不返回委托。

于 2013-04-24T10:10:40.220 回答
0

如果ConfigFileWritten事件处理程序是您自己的类型,您可以在事件上升时传递参数。派生您自己的事件参数类型EventArgs并传递给您参数。它可以为您提供更大的灵活性,并且您不必在事件处理程序中硬编码参数。

于 2013-04-24T10:14:10.020 回答