创建自定义事件
可以为任何对象方法创建自定义事件吗?
要做到这一点,我只使用以下语法?:
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是处理事件的回调,它可以在任何其他类中