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

C# 在c中将方法附加到事件时如何传递参数#,c#,events,delegates,C#,Events,Delegates,我尝试将参数发送到一个方法,该方法在附加事件侦听器时由事件调用,我可以在一个匿名方法中创建参数,该方法工作正常,但我希望使其更简洁,如下面的示例所示,这会引发以下编译器错误: 运算符“+=”不能应用于“System.EventHandler”和“void”类型的操作数 是否可以按照我的建议重新修改代码?不是这样的。您正在尝试将调用SetConfigInterfaceEnabled的结果附加为事件处理程序,这当然是不可能的(结果必须是EventHandler委托,但它只是void) 你能做的就是

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

运算符“+=”不能应用于“System.EventHandler”和“void”类型的操作数


是否可以按照我的建议重新修改代码?

不是这样的。您正在尝试将调用
SetConfigInterfaceEnabled
的结果附加为事件处理程序,这当然是不可能的(结果必须是
EventHandler
委托,但它只是
void

你能做的就是

ConfigFileWritten += (s, e) => SetConfigInterfaceEnabled("",true);
这里,事件处理程序是一个lambda函数,具有适当的签名(接受两个隐式类型的参数),该函数依次调用
SetConfigInterfaceEnabled
。其唯一目的是使
setConfigInterfaceeEnabled
的签名适应预期的
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
不会返回委托。

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

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