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

Tho*_*mas 12 c# events

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

jup*_*upi 15

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

public EventHandler<Rect> SizeRectChanged;
Run Code Online (Sandbox Code Playgroud)

举办活动:

if(SizeRectChanged != null){
   Rect r = new Rect(0,0,0,0);
   SizeRectChanged(this,r);
}
Run Code Online (Sandbox Code Playgroud)

听取活动:

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

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


nit*_*one 6

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


Chr*_*aas 2

是否可以只使用EventArgs原始数据类型?绝对地。根据 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");
    }
Run Code Online (Sandbox Code Playgroud)

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

MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1);
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用 EventArgs.Empty http://msdn.microsoft.com/en-us/library/system.eventargs.empty.aspx (5认同)