Как получить список подписчиков для события во время выполнения? - PullRequest
3 голосов
/ 18 декабря 2009

При использовании делегата я могу использовать Delegate.GetInvocationList () Метод для получения списка вызовов делегата во время выполнения.

Есть ли способ получить доступ к списку подписчиков, который был связан с событием? Я запустил код из этого примера (SO # 1237001) , и непосредственное окно позволило мне преобразовать событие SecondChange в System.MultiCastDelegate и затем вызвать метод GetInvocationList.

Однако в моем сценарии я работаю с System.Windows.Forms.DataGridView и хотел бы проверить список вызовов события CellClick во время выполнения. Однако, когда я пытаюсь использовать любой тип приведения на CellClick, я получаю следующую ошибку:

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

Я вижу, что в объявлениях этих событий явно есть различия. В примере с Clock событие объявлено так:

public event Func<DateTime, bool> SecondChange;

А в DataGridView событие объявляется так:

[SRDescription("DataGridView_CellClickDescr"), SRCategory("CatMouse")]
public event DataGridViewCellEventHandler CellClick
{
    add
    {
        base.Events.AddHandler(EVENT_DATAGRIDVIEWCELLCLICK, value);
    }
    remove
    {
        base.Events.RemoveHandler(EVENT_DATAGRIDVIEWCELLCLICK, value);
    }
}

Почему можно вызывать GetInvocationList в примере Clock, но не в событии DataGridView? Есть ли способ для меня получить информацию того же типа из события DataGridView, которое возвращает GetInvocationList?

1 Ответ

3 голосов
/ 18 декабря 2009

Весь смысл event определяет (только) API add / remove (например, как свойство определяет get / set).

Весь смысл события заключается в том, что внешне вы не можете сделать это (доступ к подписчикам). Я предполагаю, что в примере "clock" код, который обращается к списку, внутри , тип, который объявляет event; это нормально: внутри типа у вас есть полный доступ к вспомогательной реализации (часто это поле делегата).

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

Зачем тебе это? Обычно это означает, что вы делаете что-то не так (извините, но это так).

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