C# 从事件中删除委托

C# 从事件中删除委托,c#,events,reflection,delegates,C#,Events,Reflection,Delegates,我有一个活动如下: public event EventHandler<CustomEventArgs> RaiseCustomEvent; 公共事件事件处理程序RaiseCustomEvent; 下面是一些代码,用于从我正在处理的上述事件中删除委托: public void RemoveDelegate(Delegate del) { RaiseCustomEvent -= (EventHandler<CustomEventArgs>)del; } pub

我有一个活动如下:

public event EventHandler<CustomEventArgs> RaiseCustomEvent;
公共事件事件处理程序RaiseCustomEvent;
下面是一些代码,用于从我正在处理的上述事件中删除委托:

public void RemoveDelegate(Delegate del)
{
    RaiseCustomEvent -= (EventHandler<CustomEventArgs>)del;
}
public void RemoveDelegate(委托删除)
{
RaiseCustomEvent-=(EventHandler)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;
}
public void removatoraisecustomeventdelegate(委托del,字符串eventName)
{
var field=this.GetType().GetField(eventName,BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);
var fieldValue=field.GetValue(this)作为EventHandler;
fieldValue-=(EventHandler)del;
}
在上面的代码中,
字段值
设置为null,但是,当引发事件时,仍然有订户


如果我只知道事件名称,请帮助我从事件中删除代理好吗?

我所看到的
RaiseCustomEvent
将无法在
RemoveAiseCustomEventDelegate
中找到。它被声明为
public
,您正在筛选
BindingFlags.NonPublic

所以

var fieldValue = field.GetValue(this) as EventHandler<CustomEventArgs>;
var fieldValue=field.GetValue(this)作为EventHandler;
应该失败。可能
removeAsecustomeventdelegate
位于
catch
块中

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


MSDN on

何时
fieldValue
设置为空?当它被分配或当
del
被取消订阅时?当del被取消订阅时。代码不会失败。field和fieldValue变量的值均不为null。取消订阅del后,字段值设置为null。为了提高此答案的质量,最好添加几行解释。GetEvent-RemoveEventHandler-我已经添加(并更正)了您的答案链接。评论是二等公民等等;答案(和问题)应加以改进,以提高SO作为档案的价值。