2016-03-18 19 views
7

phép nói rằng chúng tôi có một đại biểuLàm thế nào để loại bỏ tất cả eventhandler

public delegate void MyEventHandler(string x); 

và một event handler

public event MyEventHandler Something; 

chúng ta thêm nhiều sự kiện ..

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

Câu hỏi của tôi là .. làm thế nào sẽ loại bỏ tất cả các phương pháp từ eventhandler giả sử một không biết nó được thêm 10 (hoặc nhiều hơn hoặc ít hơn) lần?

Trả lời

17

Đơn giản chỉ cần thiết lập sự kiện để null:

this.Something = null; 

Nó sẽ unregister tất cả các xử lý sự kiện.

+0

Tôi luôn nghĩ rằng người ta phải tự xóa chúng, nhưng đáng ngạc nhiên .. điều này không hoạt động .. Tôi đã làm điều tương tự như câu trả lời được chấp nhận trên http://stackoverflow.com/questions/447821/how-do-i- unubscribe-all-handlers-from-an-event-cho-a-specific-class-in-c – Eminem

+0

Dường như với tôi rằng thực hành này là cũng có giá trị làm bên trong một lớp 'Dispose (bool) phương pháp, nhưng tôi không xem tài liệu tham khảo để thực hành này bất cứ nơi nào. Là âm thanh suy nghĩ của tôi? –

+1

Tôi nghĩ rằng đó có thể là một ý tưởng tốt, nhưng bạn nên cẩn thận không để bloat mã của bạn, hoặc, mà có thể dẫn đến lỗi thay vì sửa chữa chúng. Tôi có một phương pháp mà tôi vượt qua trong đăng ký và unregister hành động và kêu gọi 'Dispose' nó thực hiện tất cả các hành động unregister. @PieterGeerkens –

0

Như giả ý tưởng:

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); 

       } 
      } 
} 

Cách sử dụng:

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); 

     } 

    } 

Cách sử dụng:

MyDelegate.RemoveEventHandlers(); 
Các vấn đề liên quan