2016-06-27 5 views
2

у меня есть событие следующим образом:Удаление делегата события

public event EventHandler<CustomEventArgs> RaiseCustomEvent; 

Вот код для удаления делегата из приведенного выше события, что я работаю:

public void RemoveDelegate(Delegate del) 
{ 
    RaiseCustomEvent -= (EventHandler<CustomEventArgs>)del; 
} 

Вот некоторые код, который я написал для удаления делегата, где я знаю, название события:

public void RemoveRaiseCustomEventDelegate(Delegate del, string eventName) 
{ 
    var field = this.GetType().GetField(eventName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField); 

    var fieldValue = field.GetValue(this) as EventHandler<CustomEventArgs>; 
    fieldValue -= (EventHandler<CustomEventArgs>)del; 
} 

в приведенном выше коде fieldValue имеет значение null, однако при возникновении события все еще есть абонент.

Могу ли я, пожалуйста, помочь удалить делегата из события, где у меня есть только имя события?

+0

, когда 'fieldValue' установлено нулевое значение? Когда он назначен или когда 'del' не подписывается? – nozzleman

+0

Когда del отписана. – user3736648

ответ

1
public void RemoveRaiseCustomEventDelegate(Delegate del, string eventName) 
{ 
    this.GetType() 
     .GetEvent(eventName) 
     .RemoveEventHandler(this, del); 
} 

MSDN на GetEvent

MSDN на EventInfo.RemoveEventHandler

+1

Чтобы повысить качество ответа, было бы неплохо добавить несколько строк объяснений. – TaW

+0

GetEvent - https://msdn.microsoft.com/en-us/library/wh463yz3(v=vs.110).aspx RemoveEventHandler - https://msdn.microsoft.com/en-us/library/system.reflection .eventinfo.removeeventhandler (v = vs.110) .aspx –

+0

Я добавил (и исправил) ваши ссылки на ответ. Комментарии - граждане второго сорта на SO; это ответы (и вопросы), которые следует улучшить для повышения ценности SO как архива. – TaW

0

От того, что я вижу RaiseCustomEvent, не найдено в RemoveRaiseCustomEventDelegate. Объявлено public, и вы фильтруете BindingFlags.NonPublic.

Поэтому

var fieldValue = field.GetValue(this) as EventHandler<CustomEventArgs>; 

должен потерпеть неудачу. Может быть RemoveRaiseCustomEventDelegate находится в catch -блоке?

+0

Код не подлежит. И переменные поля и fieldValue имеют значение, которое не равно нулю. После того, как del отменено, значение fieldValue равно null. – user3736648

Смежные вопросы