Un événement personnalisé peut-il être créé pour n'importe quelle méthode d'objet?
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 C # avancés
ou
L'exemple d'événements C # le plus simple imaginable
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 objets, 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 d'avoir accès à la définition d'objet et de la modifier pour déclarer l'événement personnalisé
public event EventHandler<EventArgs> ModelChanged;
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 (ModelChanged != null)
ModelChanged(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'objet déclenche l'événement.
myObject.myMethod += myNameEvent;
De même, vous pouvez détacher un gestionnaire en utilisant
myObject.myMethod -= myNameEvent;
Vous pouvez également écrire votre propre sous-classe de EventArgs
pour fournir des données spécifiques lorsque votre événement se déclenche.
Sur la base de la réponse de @ ionden, l'appel au délégué pourrait être simplifié en utilisant 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 de myObject:
public event EventHandler<EventArgs> 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