如何在 C# 中使用事件?

How to use events in c#?

我对 c# 中的事件完全陌生,这就是我想做的事情:

我有两个方法:

OpenPage1();    
OpenPage2();

当调用这些方法中的任何一个时,我想要调用名为 PerformSomeTask() 的第三个方法。

我相信这可以通过事件处理来完成。谁能告诉我怎么做?

事件是 C# 的重要组成部分。

为简单起见,您首先需要一个描述被调用方法类型的委托。在您的示例中, PerformSomeTask 是无效的并且不带任何参数。 所以在你的 class

中声明
public delegate void PerformSomeTask();

然后,您需要声明事件,这是将调用以启动您的函数的成员

public event PerformSomeTask OnPerformSomeTask;

在您的两种方法中,OpenPage1 和 OpenPage2,您需要检查是否有人订阅了您的活动,如果是,请调用它。

if(OnPerformSomeTask != null)
   OnPerformSomeTask();

这将启动订阅您的活动的每个方法。订阅者可以是多个。

要订阅,就这样:

YourClass.OnPerformSomeTask += MyVoidMethod;
[...]
public void MyVoidMethod() { DoSomething(); [...] }

每次 运行 OpenPage1 和 OpenPage2

时都会调用您的 void 方法

如果您需要一些参数,只需更改您的委托即可继续。

public delegate void PerformSomeTask(string myParam);

然后,您的方法会将此参数作为标准函数参数(使用您的值调用您的事件,将其作为参数传递给每个订阅者函数)。

您在 class 中所要做的就是添加一个具有正确事件处理程序的事件(在您的示例中为 Action)。 eventHandler 应该对应于将订阅此事件的方法。 然后从 openPage 方法触发事件。 如果没有人订阅此事件,您必须检查是否为空。

public class Foo
{
    public event Action theEvent;

    public void OpenPage1()
    {
        if (theEvent != null)
            theEvent();
    }

    public void OpenPage2()
    {
        if (theEvent != null)
            theEvent();
    }
}

public class Bar
{
    public int Counter { get; set; }

    public void PerformSomeTask()
    {
        Counter++;
    }        
}

这里有一个测试,您可以 运行 一起查看:

[TestMethod]
public void TestMethod1()
{
    var foo = new Foo();
    var bar = new Bar();
    foo.theEvent += bar.PerformSomeTask;

    foo.OpenPage1();
    foo.OpenPage2();

    Assert.AreEqual(2, bar.Counter);
}