2011-02-03 75 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