Как узнать, был ли конкретный делегат уже назначен для события?

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

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

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

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

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

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

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

Ответ 1

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

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

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

private bool handlersAdded;
private void AddHandlers()
{
    if (this.handlersAdded) return;
    myButton.Click += MyHandler1;
    this.handlersAdded = true;
}

Ответ 2

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

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