Возможно, я немного переосмыслил это, но я мог бы использовать некоторую помощь в определении способа / наилучшего способа сделать следующее.
У меня есть обработчик событий, который присоединен к объекту, который являетсясобственность другого класса.В моем обработчике событий мне нужны дополнительные метаданные об объекте, который вызвал событие (т. Е. Идентификатор объекта, в котором он содержится).От отправителя и информации о событии нет способа получить нужную мне информацию.Я склонялся к тому, что это было бы хорошим местом для использования захваченной переменной, но я не уверен в своих идеях реализации.
Поэтому для иллюстрации в коде у меня есть обработчик событий:
void MyEventHandler(object sender, EventArgs e){
//Do Stuff here
}
(В качестве заметки здесь я использую базовые EventArgs, но в моей фактической реализации это специализированный подкласс, и событие объявляется с использованием универсального EventHandler)
В настоящее время я присоединяю его так:1011 *
Позднее я отключу его следующим образом:
topObject.SubObject.EventToHandle -= MyEventHandler;
Мне нужен идентификатор topObject при обработке события, поэтому я собирался изменить MyEventHandler, чтобы иметь следующую подпись:
void MyEventHandler(int id, object sender, EventArgs e)
и прикрепите обработчик событий следующим образом:
topObject.SubObject.EventToHandle += (s,e) => MyEventHandler(topObject.ID, s,e);
Меня это беспокоит в два раза.
- Есть ли проблема с областью, где обработчик будет фактически исчезать без удаления, когда я нахожусь вне функции, к которой он прикреплен?Я видел некоторые странные ошибки в прошлом, когда обработчик событий исчезал, когда я использовал лямбда-выражение.Не всегда, просто в некоторых случаях.Может ли кто-нибудь объяснить мне, в каких случаях это может быть, чтобы я знал, когда можно безопасно использовать синтаксис, который у меня был.
- Не могу точно вспомнить, но не думаю, что когда-либо удастся удалить обработчик событий, еслиЯ использую этот синтаксис, потому что созданный неявный объект не является тем же самым.
Из-за этих двух проблем я думал создать действие и сохранить действие и использовать его, пока мне не понадобилось удалитьобработчик события.Я сделал следующее:
Action<object, EventArgs> handler = (s,e) => MyEventHandler(topObject.ID, s,e);
topObject.SubObject.EventToHandle += handler;
Я понял, что действие не может быть преобразовано в обработчик событий.Есть ли какой-нибудь простой способ сделать это преобразование, которое по-прежнему будет гарантировать, что я могу отсоединить обработчик событий?Неужели я просто подумал над этим / есть ли способ, которым я не вижу сейчас, чтобы сделать это?