2011-02-03 37 views
2
class a 
{ 
    public event Action foo; 
    var zzz = new b(); 
    foo += zzz.bar; 
} 

class b 
{ 
    public Action bar; 
} 

上面的(伪)代码工作和编译得很好。将活动添加到其他活动? c#

但是,如果我将bar更改为public event Action bar我不能将它添加到foo。 基本上我想添加一个事件到另一个。我意识到这听起来可能有点荒谬。

+0

我不认为你的代码可以编译。 – 2011-02-03 11:56:31

+1

他实际上写道,它是伪代码 – 2011-02-03 12:04:16

回答

1

你想达到什么做的就是这样的事情(我猜):

  1. foo事件被触发:
    呼吁所有foo订阅事件处理程序以及所有bar订阅事件处理程序。
  2. bar被触发:
    调用所有bar订阅的事件处理程序加上所有foo订阅的事件处理程序。

class a 
{ 
    public event Action foo; 
    b zzz = new b(); 
    public a() 
    { 
     // this allow you to achieve point (1) 
     foo += zzz.FireBarEvent; 
     // this allow you to achieve point (2) 
     zzz.bar += OnBar; 
    } 
    void OnBar() 
    { 
     FireFooEvent(); 
    } 
    void FireFooEvent() 
    { 
     if(foo != null) 
      foo(); 
    } 
} 

class b 
{ 
    public event Action bar; 
    public void FireBarEvent() 
    { 
     if(bar != null) 
      bar(); 
    } 
} 

CAVEAT:

这个代码(如果(1)和(2)的选项都被启用)导致呼叫的无限数,即:

foo --> bar --> foo --> bar ... 

必须妥善管理。

1

如果酒吧是一个公共事件,那么你使用lambda来调用吧事件:

foo +=() => zzz.bar(); 

这是不准确的语法,研究...

这是这是不可能的,因为你不能从它定义的类以外的地方呼叫酒吧事件。

你应该使用这样的解决方案;

class b { 
    public Action bar; 
    public void InvokeBar() { 
     if (bar != null) bar(); 
    } 
} 

然后,您可以使用InvokeBar作为事件的目标。

2

IIRC你不能直接调用另一个类的事件。

class A { 
    public A() { 
     b = new B(this); 
    } 

    private B b; 
    public event Action Foo; 
} 

class B { 
    public B(A a) { 
     a.Foo += InvokeBar; 
    } 

    public event Action Bar; 

    private void InvokeBar() { 
     if (Bar != null) 
      Bar(); 
    } 
} 
+0

是的,挺烦人的。你甚至不能从派生类中调用它们。你可以调用委托,所以它几乎值得使用通用的委托列表而不是事件。 – maxp 2011-02-03 12:34:54