传递参数给事件处理程序

28

在下面的代码中,我定义了一个事件处理程序,并希望在不全局声明name和age变量的情况下从中访问它们。我是否可以使用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");
}

与https://dev59.com/mGoy5IYBdhLWcg3wScPb相同。 - codingbiz
2个回答

64

是的,您可以将事件处理程序定义为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");
    }

}

3
完美的解决方案。这是干净而强大的。谢谢。 - Diego Mendes
1
真的,非常优雅的解决方案! - Pratik Singhal
如果在myProcess退出之前再次调用Test(...),会发生什么?lambda是否会创建一个隐藏类来保存Test(...)函数的参数? - MJLaukala
5
这个lambda方法使得重复利用不可能。如果你有多个发送者需要执行相同的操作,使用“+=”后面的函数会比使用lambda表达式更加清晰和易于维护。假设你有10个按钮,在按下时应该都执行相同的操作,只有一个小例外,取决于发送者,那么使用lambda表达式需要你为每个按钮单独编写lambda表达式来处理点击事件。你确定在代码更改后它们将保持不变吗? - Harald Coppoolse

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;
  }
}

并且代表

public delegate void ProcessHandler (object sender,  ProcessEventArgs data);

4
他正在使用 Process 的 Exited 事件,当触发时,将无法将 ProcessEventArgs 传递给您的处理程序。 - Francesco Baruchelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接