问题描述
我正在学习如何在类周围使用事件来通知2个类,如果一个类中出现偶数事件。我创建了以下内容。
namespace TestConsole
{
class Program : Form
{
public event EventHandler Something;
public Program()
{
Button btn = new Button();
btn.Parent = this;
btn.Text = "Click Me.!";
btn.Location = new Point(100,100);
btn.Click += Btn_Click;
Something += HandleThis;
}
private void Btn_Click(object sender,EventArgs e)
{
Something(this,null);
}
private void HandleThis(object sender,EventArgs e)
{
Console.WriteLine("From Main: Something typed");
}
static void Main(string[] args)
{
Application.Run(new Program());
Console.ReadLine();
}
}
class One
{
One()
{
Program SubscriberObj = new Program();
SubscriberObj.Something += HandleEvent;
}
private void HandleEvent(object sender,EventArgs e)
{
Console.WriteLine("From One: Something typed");
}
}
class Two
{
Two()
{
Program SubscriberObj = new Program();
SubscriberObj.Something += HandleEvent;
}
private void HandleEvent(object sender,EventArgs e)
{
Console.WriteLine("From Two: Something typed");
}
}
}
我希望在单击按钮后同时触发Class 1和Class 2的HandleEvent方法。但是我看到事件仅在Program类中引发。如何实现呢?
解决方法
您没有创建One
和Two
的实例。因此,没有任何班级将注册此事件。另外,您在program
和One
中创建Two
的新实例。但是,您需要触发事件的实例相同。您必须在构造函数中传递program
的实例。您还应该在事件触发时始终检查处理程序是否为null。
EventHandler handler = Something;
handler?.Invoke(this,new EventArgs());
此代码等效于:
EventHandler handler = Something;
if (handler != null)
{
handler.Invoke(this,new EventArgs());
}