Как отменить регистрацию всех обработчиков для события формы?
У меня есть 2 обработчики, использующие одну и ту же форму. Как удалить обработчики перед добавлением нового (C#)?
3 ответа
Если вы работаете в самой форме, вы должны сделать что-то вроде:
псевдокод:
Delegate[] events = Form1.SomeEvent.GetInvokationList();
foreach (Delegate d in events)
{
Form1.SomeEvent -= d;
}
Снаружи формы ваш SOL.
Если вы знаете, что это за обработчики, просто удалите их так же, как вы подписались на них, кроме как с -= вместо +=.
Если вы не знаете, что это за обработчики, вы не можете их удалить - идея заключается в том, что инкапсуляция событий не позволяет одной заинтересованной стороне перекрыть интересы другого класса при наблюдении за событием.
РЕДАКТИРОВАТЬ: я предполагал, что вы говорите о событии, реализованном в другом классе, например, элемент управления. Если ваш класс "владеет" событием, просто установите для соответствующей переменной значение null.
Я понимаю, что этот вопрос довольно старый, но, надеюсь, он кому-нибудь поможет. Вы можете отменить регистрацию всех обработчиков событий для любого класса с небольшим отражением.
public static void UnregisterAllEvents(object objectWithEvents)
{
Type theType = objectWithEvents.GetType();
//Even though the events are public, the FieldInfo associated with them is private
foreach (System.Reflection.FieldInfo field in theType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance))
{
//eventInfo will be null if this is a normal field and not an event.
System.Reflection.EventInfo eventInfo = theType.GetEvent(field.Name);
if (eventInfo != null)
{
MulticastDelegate multicastDelegate = field.GetValue(objectWithEvents) as MulticastDelegate;
if (multicastDelegate != null)
{
foreach (Delegate _delegate in multicastDelegate.GetInvocationList())
{
eventInfo.RemoveEventHandler(objectWithEvents, _delegate);
}
}
}
}
}