Можно передавать данные в EventArgs без создания производного класса?

Я немного смущен. Я знаю, что я могу создать класс, полученный из EventArgs, чтобы иметь пользовательские данные о событиях. Но можно ли каким-то образом использовать базовый класс EventArgs? Как и при нажатии кнопки мыши, в методе подписчика всегда присутствует параметр "EventArgs e". Могу ли я каким-то образом создать метод, который будет передавать данные таким образом, я имею в виду, что они будут переданы в базе Eventargs?

Ответ 1

Возможно ли использовать только тип данных 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);

Ответ 2

Вы можете использовать класс EventArgs с помощью подхода Generic Types. В этом примере я буду использовать класс 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;
}

Таким образом, не нужно создавать новые классы или делегаты событий, просто создайте EventHandler, передавая определенный тип T.

Ответ 3

Неа. Базовый класс EventArgs - это всего лишь способ разрешить некоторые стандартные типы делегатов событий. В конечном счете, чтобы передать данные обработчику, вам потребуется подкласс EventArgs. Вместо этого вы можете использовать аргумент отправителя, но это должен быть объект, который запустил событие.