2012-09-04 56 views
2

通知情況下,我覺得我想要做的是非常簡單的,但我不能設法通過事件

我有地方靜態事件中A類:

public static event Action OnInvalidated; 

我當我的數據無效時調用。 當我實例化一個新的B類的,我要做到以下幾點:

A.OnInvalidated+=() => this.RefreshColumns(); 

基本上,我想打電話OnInvalidated火災時,登記的每個實例RefreshColumns。

這個編譯得很好,但是如何在處理我的對象時移除lambda函數? 我認爲做

A.OnInvalidated-=() => this.RefreshColumns(); 

就不行,我不能宣佈

Action myAction =() => this.RefreshColumns(); 

爲函數成員要麼

+1

嘗試編譯第二行時會出現什麼錯誤? –

+0

「this」在當前上下文中不可用 – lezebulon

+0

@lezebulon您確切地說,您是否擁有該代碼?它不能在一個靜態方法或靜態構造... –

回答

1

首先,不要做:

A.OnInvalidated+=() => this.RefreshColumns(); 

就直接分配方法(注意()失蹤,也拉姆達聲明):

A.OnInvalidated += this.RefreshColumns; 

然後當你取消你只是做:

A.OnInvalidated -= this.RefreshColumns; 

我認爲問題在於你正在引入這個anonymou當你不需要的時候,這會讓你更難以取消訂閱該方法。

2

嘗試如下:

class A : IDisposable 
{ 
    public static event Action OnInvalidated; 

    public A() 
    { 
     A.OnInvalidated += this.SomeMethod(); 
     A.OnInvalidated += this.SomeOtherMethod(); 
    } 

     public void Dispose() 
     { 
     A.OnInvalidated -= this.SomeMethod(); 
     A.OnInvalidated -= this.SomeOtherMethod(); 
     } 

    public SomeMethod() 
    { 

    } 

    public SomeOtherMethod() 
    { 

    } 
} 

請注意,在Dispose()i中實現IDisposable並取消訂閱所有靜態事件非常重要如果你想避免內存泄漏。否則,靜態事件的訂閱者將永遠不會被垃圾收集,因爲事件會維護對該對象的引用。

+0

這不可能是正確的。 「B」是訂閱「A」的,而不是「A」。我也相信'B'是在這裏實現'IDisposable'的。 – mclark1129

+0

在這種情況下,將「A」和「公共A()」中的'A'替換​​爲'B' –

+0

..並將事件OnInvalidated替換爲單獨的類A。 – mclark1129