Как отменить регистрацию всех обработчиков события формы?

StackOverflow https://stackoverflow.com/questions/287663

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть 2 обработчика, использующих одну и ту же форму.Как удалить обработчики перед добавлением нового (C#)?

Это было полезно?

Решение

Если вы работаете в самой форме, вы сможете сделать что-то вроде:

Псевдокод:

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);
                }
            }
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top