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

时间:2009-12-21 21:03:39

标签: c# events

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

3 个答案:

答案 0 :(得分:15)

您可以通过Generic Types方法使用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。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

是否可以只使用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);