2008-11-13 2 views

ответ

10

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

псевдокод:

Delegate[] events = Form1.SomeEvent.GetInvokationList(); 

foreach (Delegate d in events) 
{ 
    Form1.SomeEvent -= d; 
} 

От внешней формы, ваш SOL.

+6

Я у вас есть доступ к переменной, просто установите его в нуль - не нужно, чтобы пройти через список вызовов ... – 2008-11-13 17:58:01

7

Если вы знаете, что эти обработчики, просто удалите их так же, как вы подписались на них, кроме как - = вместо + =.

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

EDIT: Я предполагаю, что вы говорите о событии, реализованном другим классом, например. контроль. Если ваш класс «владеет» событием, то просто установите для соответствующей переменной значение null.

2

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

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); 
       } 
      } 
     } 
    } 
} 
Смежные вопросы