C# 检查是否已附加特定的事件处理程序方法

C# 检查是否已附加特定的事件处理程序方法,c#,.net,events,c#-4.0,event-handling,C#,.net,Events,C# 4.0,Event Handling,关于这个问题,, 但不同的是,我只想知道事件是否附加了特定的方法。所以可能还有其他附加的方法,但我只想知道是否存在特定的方法 我的环境是C#in dotnet 4.0 例如 这可能吗?不可能。你不能。 Event.GetInvocationList().Any(x => x.Method.Name.Equals("yourmethodname")); event关键字是为了阻止你做你想做的事情而明确发明的。它使事件的委托对象不可访问,因此没有人可以干扰事件处理程序 资料来源: 使用Ge

关于这个问题,,

但不同的是,我只想知道事件是否附加了特定的方法。所以可能还有其他附加的方法,但我只想知道是否存在特定的方法

我的环境是C#in dotnet 4.0

例如

这可能吗?

不可能。你不能。
Event.GetInvocationList().Any(x => x.Method.Name.Equals("yourmethodname"));
event关键字是为了阻止你做你想做的事情而明确发明的。它使事件的委托对象不可访问,因此没有人可以干扰事件处理程序

资料来源:


使用
GetInvocationList
方法对学员进行循环。

此处延迟回答。我相信Parimal Raj的回答是正确的,因为我无法找到直接访问事件的方法。但是,我创建了两种方法来解决这个问题:

  • 在添加之前删除。如果该方法不存在,我在尝试删除不存在的方法时没有收到错误。这样可以确保调用列表只调用method1一次

    Event -= MyMethod1;
    Event += MyMethod1;
    
  • 要向其中添加事件的对象可能具有.Tag属性。您可以使用标记来存储有关已添加方法的信息。这里我只有一个方法,所以我只需要检查标记是否为null。但更复杂的情况可以通过这种方式处理:

    if(control.Tag == null)
    {
         //ony added once, when tag is null
         control.TextChanged += new EventHandler(validate); 
         control.Tag = new ControlTag();
    }
    

  • 可能重复:啊,是的。。。可以用这种方法感谢(这个问题的第一个答案)或者重复感谢是的,这是我的印象。不知道是否有办法解决这个问题。根据其他帖子的印象,GetInvocationList并不总是可访问的…它是框架的一部分。完全可以接受。不可接受的是草率的代码,它错误地实现了它,并且任性地留下对象。一定要处理好你的课程。对于您提出的问题,这是一种完全可以接受的做法。“它是框架的一部分。完全可以接受。”我的意思是,如果事件来自第三方组件,您可能无权调用GetInvocationList()。与可接受性不同。GetInvocationList()仅在声明事件的类中可用。。我如何在另一个类中使用它(例如,我正在使用它);我需要在Monitor类中使用它来标识有多少个事件处理程序与一个事件关联。。我该怎么办?
    Event -= MyMethod1;
    Event += MyMethod1;
    
    if(control.Tag == null)
    {
         //ony added once, when tag is null
         control.TextChanged += new EventHandler(validate); 
         control.Tag = new ControlTag();
    }