可以为任何对象方法创建自定义事件吗?
要做到这一点,我只使用以下语法?:
myObject.myMethod +=new EventHandler(myNameEvent);
Run Code Online (Sandbox Code Playgroud)
以下代码提示此问题:
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();
}
Run Code Online (Sandbox Code Playgroud)
ion*_*den 40
声明包含事件的类:
class MyClass {
public event EventHandler MyEvent;
public void Method() {
OnEvent();
}
private void OnEvent() {
if (MyEvent != null) {
MyEvent(this, EventArgs.Empty);
}
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
MyClass myObject = new MyClass();
myObject.MyEvent += new EventHandler(myObject_MyEvent);
myObject.Method();
Run Code Online (Sandbox Code Playgroud)
Pra*_*ana 32
是的你可以这样做:
要么
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();
}
}
Run Code Online (Sandbox Code Playgroud)
dar*_*yal 14
是的,你可以在对象上创建事件,这是一个例子;
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);
}
}
Run Code Online (Sandbox Code Playgroud)
是的,前提是您可以访问对象定义并可以对其进行修改以声明自定义事件
public event EventHandler<EventArgs> ModelChanged;
Run Code Online (Sandbox Code Playgroud)
通常你会使用内部用于调用事件的私有方法来备份它:
private void OnModelChanged(EventArgs e)
{
if (ModelChanged != null)
ModelChanged(this, e);
}
Run Code Online (Sandbox Code Playgroud)
您的代码只是声明了声明myMethod事件的处理程序(您也可以删除构造函数),每次对象触发事件时都会调用它.
myObject.myMethod += myNameEvent;
Run Code Online (Sandbox Code Playgroud)
同样,您可以使用分离处理程序
myObject.myMethod -= myNameEvent;
Run Code Online (Sandbox Code Playgroud)
此外,您可以编写自己的子类,EventArgs以便在事件触发时提供特定数据.
基于@ ionden的答案,自C#6.0起,可以使用空传播简化对委托的调用.
您的代码只是:
class MyClass {
public event EventHandler MyEvent;
public void Method() {
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
MyClass myObject = new MyClass();
myObject.MyEvent += new EventHandler(myObject_MyEvent);
myObject.Method();
Run Code Online (Sandbox Code Playgroud)