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

C# 是否可以在不创建派生类的情况下将数据传递给EventArgs?,c#,events,C#,Events,我有点困惑。我知道我可以创建从EventArgs派生的类,以便拥有自定义事件数据。但是我能以某种方式使用基类EventArgs吗?与鼠标单击一样,在subscriber方法中,始终存在“EventArgs e”参数。我是否可以以某种方式创建以这种方式传递数据的方法,我的意思是它们将在基本事件参数中传递?否。EventArgs基类只是允许某些标准事件委托类型的一种方式。最终,要将数据传递给处理程序,需要将EventArgs子类化。您可以使用sender arg,但实际上应该是触发事件的对象。可以只

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

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

可以只使用
EventArgs
数据类型raw吗?绝对地根据MSDN:

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

你应该这样做吗?我想没有任何理由。如果您想创建自己的点击,您也可以自己实例化
MouseEventArgs

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

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

public EventHandler<Rect> 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。空是打字错误吗<代码>TestEventHandler。有两个事件词。但是在代码中。您使用了
TestEventHandler
。这看起来是错误的。显示Rect或TEventArg必须从EventArgs继承。除非我有什么误解。托马斯,我也觉得这很困惑。但是朱皮的建议对我很管用哇。。。但愿我早就知道这一点。我一直认为,当您声明EventHandler时,T必须派生自EventArgs。例如,如果我需要发送一个带有我的事件的字符串,我将创建一个新的类StringEventArgs,它是从EventArgs子类化的。Thomas Lann链接到的MSDN文档肯定会说“它的第二个参数是从EventArgs类型派生的,并保存事件数据”,这对大多数读者来说意味着不能使用任何任意类。但编译器似乎不介意使用EventHandler,据我所知,这完全可以正常工作。在Microsoft Visual Studio Community 2015中,这会引发一个错误:错误CS0315类型“float”不能用作泛型类型或方法“EventHandler”中的类型参数“TEventArgs”。没有从“float”到“System.EventArgs”的装箱转换。
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;
}