Créer un événement personnalisé

Un événement personnalisé peut-il être créé pour n’importe quelle méthode d’object?
Pour ce faire, j’utilise simplement la syntaxe suivante ?:

myObject.myMethod +=new EventHandler(myNameEvent); 

Le code suivant a posé cette question:

  private void btRunProcessAndRefresh_Click(object sender,EventArgs e) { myProcess =new Process(); myProcess.StartInfo.FileName = @"c:\ConsoleApplication4.exe"; myProcess.Exited += new EventHandler(MyProcessExited); myProcess.EnableRaisingEvents =true; myProcess.SynchronizingObject =this; btRunProcessAndRefresh.Enabled =false; myProcess.Start(); } 

Oui, vous pouvez faire comme ça:

Création d’événements personnalisés avancés C #

ou

L’exemple le plus simple des événements C # imaginables

  public class Metronome { public event TickHandler Tick; public EventArgs e = null; public delegate void TickHandler(Metronome m, EventArgs e); public void Start() { while (true) { System.Threading.Thread.Sleep(3000); if (Tick != null) { Tick(this, e); } } } } public class Listener { public void Subscribe(Metronome m) { m.Tick += new Metronome.TickHandler(HeardIt); } private void HeardIt(Metronome m, EventArgs e) { System.Console.WriteLine("HEARD IT"); } } class Test { static void Main() { Metronome m = new Metronome(); Listener l = new Listener(); l.Subscribe(m); m.Start(); } } 

Déclarez la classe contenant l’événement:

 class MyClass { public event EventHandler MyEvent; public void Method() { OnEvent(); } private void OnEvent() { if (MyEvent != null) { MyEvent(this, EventArgs.Empty); } } } 

Utilisez-le comme ceci:

 MyClass myObject = new MyClass(); myObject.MyEvent += new EventHandler(myObject_MyEvent); myObject.Method(); 

Oui, vous pouvez créer des événements sur des objects, voici un exemple;

 public class Foo { public delegate void MyEvent(object sender, object param); event MyEvent OnMyEvent; public Foo() { this.OnMyEvent += new MyEvent(Foo_OnMyEvent); } void Foo_OnMyEvent(object sender, object param) { if (this.OnMyEvent != null) { //do something } } void RaiseEvent() { object param = new object(); this.OnMyEvent(this,param); } } 

Oui, à condition que vous ayez access à la définition d’object et que vous puissiez la modifier pour déclarer l’événement personnalisé.

 public event EventHandler ModelChnaged; 

Et normalement, vous sauvegarderiez cela avec une méthode privée utilisée en interne pour appeler l’événement:

 private void OnModelChanged(EventArgs e) { if (ModelChnaged != null) ModelChnaged(this, e); } 

Votre code déclare simplement un gestionnaire pour l’événement myMethod déclaré (vous pouvez également supprimer le constructeur), qui serait invoqué chaque fois que l’object déclenche l’événement.

 myObject.myMethod += myNameEvent; 

De même, vous pouvez détacher un gestionnaire à l’aide de

 myObject.myMethod -= myNameEvent; 

En outre, vous pouvez écrire votre propre sous-classe EventArgs pour fournir des données spécifiques lors du déclenchement de votre événement.

Sur la base de la réponse de @ ionden, l’appel du délégué pourrait être simplifié à l’aide de la propagation nulle depuis C # 6.0.

Votre code serait simplement:

 class MyClass { public event EventHandler MyEvent; public void Method() { MyEvent?.Invoke(this, EventArgs.Empty); } } 

Utilisez-le comme ceci:

 MyClass myObject = new MyClass(); myObject.MyEvent += new EventHandler(myObject_MyEvent); myObject.Method(); 

Vous devez déclarer votre événement dans la classe à partir de myObject:

 public event EventHandler myMethod; //you should name it as an event, like ObjectChanged. 

alors myNameEvent est le rappel pour gérer l’événement, et il peut être dans n’importe quelle autre classe