创建自定义事件

可以为任何对象方法创建自定义事件吗?
要做到这一点,我只使用以下语法?:

myObject.myMethod +=new EventHandler(myNameEvent); 

以下代码提示此问题:

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

是的你可以这样做:

创建高级C#自定义事件

要么

可以想象的最简单的C#事件示例

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

声明包含事件的类:

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

像这样用它:

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

是的,你可以在对象上创建事件,这是一个例子;

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

是的,前提是您可以访问对象定义并可以对其进行修改以声明自定义事件

 public event EventHandler ModelChnaged; 

通常你会使用内部用于调用事件的私有方法来备份它:

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

您的代码只是声明了声明的myMethod事件的处理程序(您也可以删除构造函数),每次对象触发事件时都会调用该处理程序。

 myObject.myMethod += myNameEvent; 

同样,您可以使用分离处理程序

 myObject.myMethod -= myNameEvent; 

此外,您可以编写自己的EventArgs子类,以便在事件触发时提供特定数据。

基于@ ionden的答案,自C#6.0起,可以使用空传播简化对委托的调用。

您的代码只是:

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

像这样用它:

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

您需要在myObject中声明您的事件:

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

然后myNameEvent是处理事件的回调,它可以在任何其他类中