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

C# 将参数传递给事件处理程序,c#,events,event-handling,handler,C#,Events,Event Handling,Handler,在下面的代码中,我定义了一个事件处理程序,并希望从中访问age和name变量,而不全局声明name和age。有没有一种方法我可以说e.age和e.name void Test(string name, string age) { Process myProcess = new Process(); myProcess.Exited += new EventHandler(myProcess_Exited); } private void myProcess_Exited(ob

在下面的代码中,我定义了一个事件处理程序,并希望从中访问age和name变量,而不全局声明name和age。有没有一种方法我可以说
e.age
e.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");
}

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

}

如果要访问用户名和年龄,应创建使用自定义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);

与他使用的已退出流程事件的可能副本相同,触发该事件后,将永远无法将ProcessEventArgs传递给handlerPerfect解决方案。这是干净有力的。非常感谢,非常优雅的解决方案!如果在myProcess退出之前再次调用Test(…),会发生什么?lambda是否创建了一个隐藏类来保存Test(…)函数的参数?这个lambda方法使重用变得不可能。如果有多个发送方的行为应该相同,则+=后面的函数比使用lambda表达式更清晰、更易于维护。假设您有10个按钮,这些按钮在按下时都应该执行相同的操作,只有一个小的例外,这取决于发送者,那么使用lambda表达式需要您在+=for every button clicked事件之后编写lambda表达式。您确定在代码更改后它们将保持不变吗?