Как узнать, назначен ли конкретный делегат на событие? - PullRequest
11 голосов
/ 04 ноября 2010

У меня есть командная кнопка на winform. Итак, если у меня есть что-то вроде:

myButton.Click += MyHandler1;
myButton.Click += MyHandler2;
myButton.Click += MyHandler3;

Как мне узнать, был ли какой-либо конкретный MyHandler уже добавлен в событие Click, чтобы он больше не добавлялся где-то еще в моем коде?

Я прочитал, как вы можете использовать GetInvocationList () для информации о вашем собственном событии. Но я получаю ошибки, когда пытаюсь получить элементы для моей командной кнопки, используя различные комбинации. Это говорит,

«Событие 'System.Windows.Forms.Control.Click' может появляться только на левой стороне из + = или - =. "

Чего мне не хватает?

[Изменить] - Я хотел бы подчеркнуть этот вопрос , который указал Ахмад. Это клудж и должно быть проще ИМХО, но, похоже, это может сработать.

Ответы [ 2 ]

11 голосов
/ 04 ноября 2010

Если вы сомневаетесь, что ваш обработчик уже добавлен, просто удалите его и добавьте снова.Если ваш обработчик не был добавлен в первую очередь, ваше удаление просто игнорируется.

myButton.Click -= MyHandler1;
myButton.Click += MyHandler1;

Вы также можете создать один метод для присоединения к событию и убедиться, что код запускается только один раз.

private bool handlersAdded;
private void AddHandlers()
{
    if (this.handlersAdded) return;
    myButton.Click += MyHandler1;
    this.handlersAdded = true;
}
3 голосов
/ 04 ноября 2010

Использование GetIvocationList может быть сделано только изнутри владельца события (в вашем случае myButton), это одна из идей, лежащих в основе событий (в отличие от делегатов).

Как сказал Слагстер, вы не можете проверить список вызовов извне myButton, но вы можете попробовать удалить MyHandler # перед его добавлением.

...