2016-06-27 16 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

の?それが割り当てられているとき、または 'del'がunsubscribedされているとき? – nozzleman

+0

delが登録解除されている場合。 – user3736648

答えて

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

GetEvent

MSDNのMSDN `nullに設定されてfieldValue` 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

コードは失敗しません。 field変数とfieldValue変数の両方にnull値ではない値があります。 delがunsubscribedされた後、fieldValueはnullに設定されます。 – user3736648

関連する問題