c# - 从事件中删除委托(delegate)

标签 c# events reflection delegates

我有一个事件如下:

public event EventHandler<CustomEventArgs> RaiseCustomEvent;

下面是一些代码,用于从我正在处理的上述事件中删除委托(delegate):

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

这是我编写的一些代码,用于删除我知道事件名称的委托(delegate):

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

如果我只有事件名称,能否从事件中删除委托(delegate)?

最佳答案

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

MSDN GetEvent

MSDN EventInfo.RemoveEventHandler

关于c# - 从事件中删除委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38047186/

相关文章:

c# - WPF - Storyboard 完成事件

c# - 创建运行时确定类型实例的最佳方法

c# - 由于密码复杂性,更改 Active Directory 密码总是失败

c# - 使用 Crypto-JS 和 C# 解密的 AES 加密 - 避免 "Padding is invalid and cannot be removed."

c# - Android gmail gif 闪烁

c# - 控制键加鼠标滚轮

actionscript-3 - 您对 NResponder 感觉如何?

c# - 获取 NHibernate 的 JetDriver

.net - 如何将 GetMethod 用于静态扩展方法

java - LambdaMetaFactory 和私有(private)方法