web-dev-qa-db-fra.com

Passer des arguments à un gestionnaire d'événements

Dans le code ci-dessous, je définis un gestionnaire d'événements et j'aimerais accéder à la variable age et name à partir de cela sans déclarer le nom et l'âge globalement. Existe-t-il un moyen de dire e.age et 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");
}
26
user476566

Oui, vous pouvez définir le gestionnaire d'événements comme une expression 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");
    }

}
61
ColinE

Si vous souhaitez accéder au nom d'utilisateur et à l'âge, vous devez créer un gestionnaire qui utilise des EventArgs personnalisés (hérités de la classe EventArgs), comme suit:


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

et le délégué

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