可以在不创建派生类的情况下将数据传递给EventArgs吗?

我有点困惑。 我知道我可以创建派生自EventArgs的类,以便拥有自定义事件数据。 但我可以以某种方式使用基类EventArgs吗? 像鼠标按钮一样,在订阅者方法中,始终存在“EventArgs e”参数。 我能以某种方式创建以这种方式传递数据的方法,我的意思是它们将在基础Eventargs中传递吗?

是否可以只使用EventArgs数据类型raw? 绝对。 根据MSDN:

该类不包含事件数据; 它在事件被引发时由不将状态信息传递给事件处理程序的事件使用。 如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

  private event TestEventEventHandler TestEvent; private delegate void TestEventEventHandler(EventArgs e); private void button1_Click(object sender, EventArgs e) { TestEvent += TestEventHandler; if (TestEvent != null) { TestEvent(new EventArgs()); } } private void TestEventHandler(EventArgs e) { System.Diagnostics.Trace.WriteLine("hi"); } 

你应该这样做吗? 不出于任何原因,我可以考虑。 如果您想创建自己的点击,您也可以自己实例化MouseEventArgs

 MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1); 

您可以通过Generic Types方法使用EventArgs类。 在此示例中,我将使用Rect类作为返回类型:

 public EventHandler SizeRectChanged; 

举办活动:

 if(SizeRectChanged != null){ Rect r = new Rect(0,0,0,0); SizeRectChanged(this,r); } 

听取活动:

 anyElement.SizeRectChanged += OnSizeRectChanged; public void OnSizeRectChanged(object sender, Rect e){ //TODO abything using the Rect class e.Left = e.Top = e.Width = e.Height = 50; } 

因此,不需要创建新的事件类或委托,只需创建一个传递特定类型T的EventHandler。

不。 EventArgs基类只是一种允许某些标准事件委托类型的方法。 最终,要将数据传递给处理程序,您需要子类化EventArgs。 您可以使用sender arg,但这应该是触发事件的对象。