从事件中删除委托

时间:2016-06-27 06:28:18

标签: c# events reflection delegates

我的活动如下:

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,但是,当引发事件时,仍然有订阅者。

我可以请一些帮助从活动中删除一名代表,我只有活动名称吗?

2 个答案:

答案 0 :(得分:1)

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

GetEvent

上的MSDN

EventInfo.RemoveEventHandler

上的MSDN

答案 1 :(得分:0)

我认为RaiseCustomEvent中找不到RemoveRaiseCustomEventDelegate。它被声明为public,您正在过滤BindingFlags.NonPublic

因此

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

应该失败。也许RemoveRaiseCustomEventDelegate位于catch - 阻止?