【问题标题】:Passing arguments to an event handler将参数传递给事件处理程序
【发布时间】:2012-08-30 21:11:50
【问题描述】:

在下面的代码中,我定义了一个事件处理程序,并希望从中访问年龄和名称变量,而无需全局声明名称和年龄。有没有办法可以说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");
}

【问题讨论】:

标签: c# events event-handling handler


【解决方案1】:

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

【讨论】:

  • 他正在使用 Process 的 Exited 事件,该事件在触发时将永远无法将 ProcessEventArgs 传递给您的处理程序
【解决方案2】:

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

}

【讨论】:

  • 完美解决方案。这是干净和强大的。谢谢
  • 真的,非常优雅的解决方案!
  • 如果在 myProcess 退出之前再次调用 Test(...) 会发生什么? lambda 是否创建了一个隐藏类来保存来自 Test(...) 函数的参数?
  • 这种 lambda 方法使重用变得不可能。如果您有多个应该执行相同操作的发送者,则 += 之后的函数比使用 lambda 表达式更清晰且可维护。假设您有 10 个按钮,它们在按下时都应该执行相同的操作,只有一个小例外,具体取决于发送者,那么使用 lambda 表达式需要您在 += 之后为每个按钮单击事件编写 lambda 表达式。您确定它们在代码更改后会保持不变吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多