C #: Как вызвать событие, используя отражение? - PullRequest
1 голос
/ 17 октября 2010

В моей форме есть несколько кнопок, и в определенный момент в моем коде я хочу вызвать событие Click. Я мог бы сделать что-то вроде этого:

if (myButton == btnFoo)
  btnFoo_Click(this, new EventArgs());
else if (myButton == btnBar)
  btnBar_Click(this, new EventArgs());
else if // blah blah
  ...

Очевидно, что это не идеально. Это похоже на случай для размышления, но я не могу найти правильный способ сделать это, например.

var ei = myButton.GetType().GetEvent("Click"); // so far so good;
var mi = ei.GetRaiseMethod(); // always returns null - no good!

Документация для GetRaiseMethod .

Так как я могу заставить код клика выполняться?

Ответы [ 4 ]

4 голосов
/ 17 октября 2010

Используйте метод PerformClick:

 myButton.PerformClick();

Может быть, вы должны привести к Баттону, я не могу сказать из вашего фрагмента. Я предполагаю, что вам больше не нужно использовать код отражения:)

4 голосов
/ 17 октября 2010

В общем, вы не можете.Смысл события состоит в том, чтобы разрешить клиентам подписываться и отписываться - это должно быть до издателя , чтобы поднять событие.Тот факт, что четное равно a GetRaiseMethod несколько странно, на мой взгляд, и не поддерживается в C # (вы можете указать только методы добавления / удаления).

Одна альтернатива - иметьDictionary<Button, EventHandler> или что-то подобное, и зарегистрируйте там все обработчики событий ... но вы можете подумать о , почему вы хотите заставить событие click запускаться эффективно.Возможно, есть лучший дизайн, который позволит избежать этой проблемы.

1 голос
/ 24 января 2013

У меня похожая проблема.У меня есть элемент управления, который вызывает событие щелчка при нажатии.Я хочу вызвать событие, когда нажата быстрая клавиша, это отслеживается компонентом в моей форме.Для этого я добавил следующий код в свой пользовательский элемент управления.

public void PerformClick()
{            
    OnClick(new EventArgs());
}

Затем я просто нажимаю кнопку, используя

ctl.PerformClick();
0 голосов
/ 17 октября 2010

Джон Скит прав;Что касается "контракта", то есть метод add и remove, и это все.В действительности, нет никакой гарантии, что событие реализовано как «полевое» событие с резервным многоадресным делегатом.Может существовать практически любая вспомогательная структура данных для хранения каждого обратного вызова (или вообще никакой).Следовательно, «возникновение события» на объекте в общем нечетко определено.

Редактировать: Удалено предложение, основанное на отражении.Отправляйся с @Hans Passant.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...