2011-06-06 60 views
4

我寫了一些類:如何去除匿名方法的回調監聽?

public class A 
{ 
    public A() 
    { 
     serviceAdapter.CompletedCallBackEvent += new EventHandler(foo); 
     . 
     . 
     . 
    } 

    void foo(object sender, EventArgs e) 
    { 
     serviceAdapter.CompletedCallBackEvent -= new EventHandler(foo); 
    } 
} 

現在,我要換一些匿名的回調監聽器 - 但我不知道如何刪除回調監聽器的匿名方法。

class A 
{ 
    public A() 
    { 
      serviceAdapter.CompletedCallBackEvent += delegate(object sender, EventArgs ee) 
      { 
        ... need to remove the listener to the event. 
      } 
    } 
} 

回答

4

您可以簡單地將您的委託/處理程序分配給一個私有變量。

private EventHander _handler = null; 

public A() 
{   
    _handler = delegate(object sender, EventArgs ee) 
     {   
      ServiceAdapter.CompletedCallBackEvent -= _handler; 
     }; 
    ServiceAdapter.CompletedCallBackEvent += _handler; 
} 
+0

你怎麼可以指定委託私有變量?我試着和它不工作(不編譯) – Yanshof 2011-06-06 13:32:43

+0

@Yanshof:你可以在你的EventHandler類中創建一個私有變量,而不是我上面提到的CompletedCallBackEventHandler(它是一種僞代碼)......你能不能提一下哪種類型的錯誤你越來越?我假設這是「CompletedCallBackEventHandler」上的錯誤你也在你的方法/構造函數中分配這個私有變量 – Hasanain 2011-06-06 13:37:31

+0

我是這樣寫的 - 它不是編譯 – Yanshof 2011-06-06 13:41:09

4

您不能刪除這樣的匿名委託。有關匿名代表的信息,請參見MSDN。另外值得一讀this article

您可能能夠做到:

 public A() 
    { 
     EventHandler myHandler = null; 
     myHandler = new EventHandler(delegate(object s, EventArgs e) 
      { 
       serviceAdapter.CompletedCallbackEvent -= myHandler; 
      }); 

     serviceAdapter.CompletedCallBackEvent += myHandler; 
    } 
+0

我把'myEvent'修正爲'serviceAdapter.CompletedCallbackEvent',這樣可以+1。 – user7116 2011-06-06 13:53:59

+0

@sixlettervariables謝謝,我錯過了。 – IndigoDelta 2011-06-06 14:11:07

+0

沒問題,先生,看起來像複製/粘貼省略。 – user7116 2011-06-06 14:13:50