将参数传递给事件处理程序

use*_*566 28 c# events event-handling handler

在下面的代码中,我定义了一个事件处理程序,并希望从中访问age和name变量,而不是全局声明名称和年龄.有没有一种方法,我可以说e.agee.name

void Test(string name, string age)
{
    Process myProcess = new Process(); 
    myProcess.Exited += new EventHandler(myProcess_Exited);
}

private void myProcess_Exited(object sender, System.EventArgs e)
{
  //  I want to access username and age here. ////////////////
    eventHandled = true;
    Console.WriteLine("Process exited");
}
Run Code Online (Sandbox Code Playgroud)

Col*_*inE 63

是的,您可以将事件处理程序定义为lambda表达式:

void Test(string name, string age)
{
  Process myProcess = new Process(); 
  myProcess.Exited += (sender, eventArgs) =>
    {
      // name and age are accessible here!!
      eventHandled = true;
      Console.WriteLine("Process exited");
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 这种lambda方法使重用变得不可能.如果你有几个应该相同的发送者,+ =之后的函数比使用lambda表达式更清晰和可维护.假设有10个按钮,按下时应该都是相同的,只有一个小异常,具体取决于发送方,然后使用lambda表达式要求您在每个按钮单击事件的+ =之后编写lambda表达式.你确定代码更改后它们会保持不变吗? (5认同)
  • 哇,这很优雅.让我更喜欢C#. (4认同)
  • 完美解决方案 这很干净而且很强大.谢谢 (3认同)

Mac*_*ska 11

如果要访问用户名和年龄,则应创建使用自定义EventArgs(继承自EventArgs类)的处理程序,如下所示:


public class ProcessEventArgs : EventArgs
{
  public string Name { get; internal set; }
  public int  Age { get; internal set; }
  public ProcessEventArgs(string Name, int Age)
  {
    this.Name = Name;
    this.Age = Age;
  }
}
Run Code Online (Sandbox Code Playgroud)

和代表

public delegate void ProcessHandler (object sender,  ProcessEventArgs data);
Run Code Online (Sandbox Code Playgroud)

  • 他正在使用Process的Exited事件,当触发时将永远无法将ProcessEventArgs传递给您的处理程序 (4认同)