【问题标题】:Remove a delegate from an event从事件中删除委托
【发布时间】:2016-06-27 06:28:18
【问题描述】:

我有一个事件如下:

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

在我只有活动名称的情况下,我可以帮忙从活动中删除代表吗?

【问题讨论】:

  • fieldValue 何时设置为空?何时分配或取消订阅del
  • 当 del 被取消订阅时。

标签: c# events reflection delegates


【解决方案1】:
public void RemoveRaiseCustomEventDelegate(Delegate del, string eventName)
{
    this.GetType()
        .GetEvent(eventName)
        .RemoveEventHandler(this, del);
}

GetEvent 上的 MSDN

MSDN EventInfo.RemoveEventHandler

【讨论】:

【解决方案2】:

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

因此

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

应该会失败。也许RemoveRaiseCustomEventDelegatecatch-block 中?

【讨论】:

  • 代码没有失败。 field 和 fieldValue 变量都有一个不为空的值。 del 退订后,fieldValue 设置为 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
相关资源
最近更新 更多