2012-09-04 55 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