【问题标题】:How to remove all eventhandler [duplicate]如何删除所有事件处理程序[重复]
【发布时间】:2016-07-05 05:06:40
【问题描述】:

假设我们有一个委托

public delegate void MyEventHandler(string x);

和一个事件处理程序

public event MyEventHandler Something;

我们添加多个事件..

for(int x = 0; x <10; x++)  
{
   this.Something += HandleSomething;
}

我的问题是 .. 假设一个人不知道它被添加了 10 次(或更多或更少)次,如何从事件处理程序中删除所有方法?

【问题讨论】:

    标签: c# delegates event-handling


    【解决方案1】:

    只需将事件设置为null:

    this.Something = null;
    

    它将注销所有事件处理程序。

    【讨论】:

    • 我一直认为必须手动删除它们,但令人惊讶的是..这确实有效..我在stackoverflow.com/questions/447821/…上做了类似接受的答案
    • 在我看来,这种做法非常值得在类的 Dispose(bool) 方法中进行,但我在任何地方都没有看到对这种做法的引用。我的想法合理吗?
    • 我认为这可能是一个好主意,但你应该小心不要让你的代码膨胀,这可能最终导致错误而不是修复它们。我有一个方法可以传入注册和注销操作,并在调用Dispose 时执行所有注销操作。 @PieterGeerkens
    • 我认为这是不可能的:stackoverflow.com/a/153744/62921 或者在那种特殊情况下可能吗?
    • @ForceMagic 这是来自类本身。所以这是可能的。
    【解决方案2】:

    作为伪想法:

    C#5

    class MyDelegateHelperClass{
        public static void RemoveEventHandlers<TModel, TItem>(MulticastDelegate m, Expression<Func<TModel, TItem>> expr) {
    
    
                    EventInfo eventInfo= ((MemberExpression)expr.Body).Member as EventInfo;
    
    
                    Delegate[] subscribers = m.GetInvocationList();
    
                    Delegate currentDelegate;
    
                    for (int i = 0; i < subscribers.Length; i++) {
    
                        currentDelegate=subscribers[i];
                        eventInfo.RemoveEventHandler(currentDelegate.Target,currentDelegate);
    
                    }
                }
    }
    

    用法:

     MyDelegateHelperClass.RemoveEventHandlers(MyDelegate,()=>myClass.myDelegate);
    

    C#6

    public static void RemoveEventHandlers(this MulticastDelegate m){
    
            string eventName=nameof(m);
    
            EventInfo eventInfo=m.GetType().ReflectingType.GetEvent(eventName,BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
    
    
            Delegate[] subscribers = m.GetInvocationList();
    
            Delegate currentDelegate;
    
            for (int i = 0; i < subscribers.Length; i++) {
    
                currentDelegate=subscribers[i];
                eventInfo.RemoveEventHandler(currentDelegate.Target,currentDelegate);
    
            }
    
        }
    

    用法:

    MyDelegate.RemoveEventHandlers();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2010-11-24
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多