创建自定义事件

why*_*heq 30 c# events

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

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

是的你可以这样做:

创建高级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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对我来说这看起来不是最简单的例子. (45认同)
  • @PranayRana什么是HeardIt? (3认同)

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)

  • 当你看到EventHandler时,它只是一个特定的委托. (3认同)
  • 我看一下提供的其他一些例子,它们不包括"委托" - 我以前没遇到过 (2认同)
  • 说明一下,如果您需要与用于 [`EventHandler`](https://msdn.microsoft.com/en-us/library/system.eventhandler(v= vs.110).aspx) 或 [`EventHandler<>`](https://msdn.microsoft.com/en-us/library/db0etb8x(v=vs.110).aspx)。有关详细信息,请参阅 [此处](http://csharpindepth.com/Articles/Chapter2/Events.aspx)。 (2认同)

Str*_*llo 6

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

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以便在事件触发时提供特定数据.


Ant*_* C. 5

基于@ 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)