2010-02-13 19 views
0

我有一個與事件有關的問題(不,它不是從我的上一個重複)。我感興趣的是,如果不指定直接方法名稱,我是否可以向課堂發送活動。我不能用英語很好的解釋,請看看代碼:發送活動給班級,但沒有方法名稱

class a 
{ 
    public event eventhandler TEST; 
    b _b=new b(); 
TEST+=b_.MethodA(); //this is not useful for me since I need to know the method name that will be used by class B. } 

class b 
{ 
MethodA(); 
} 

我只需要提高一個事件,讓B級車主(B類中),以確定哪些方法會被調用。我能想到的唯一想法是將事件或類作爲參數傳遞給B類構造函數。

+1

如果你不知道方法的名稱,你知道你想要訂閱哪個處理程序?可能有多種可能性。 – 2010-02-13 11:19:24

+0

我想到了像匿名方法的東西..所以它不可能? – Gustav 2010-02-13 11:21:51

+0

該示例似乎表明您想要將某些類連接到_your_事件。你爲什麼不反轉它,將事件處理器傳遞給B?您可以在該課程中決定是否以及如何訂閱。 – 2010-02-13 11:22:39

回答

0

假設不知道B:若B知道A,則B可以增加它的方法到事件之一A.

如果另一方面A和B都不具有對其他知識,但是它們在程序中仍然存在某種相關性,那麼在其他地方必須存在代碼,這些代碼將它們彼此聯繫起來並具有兩者的知識。在這種情況下,這個外部代碼應該建立連接。

A a = new A(); 
B b = new B(); 
a.TEST += b.methodA(); 

這樣回答你的問題嗎?

2

如果你想讓B類決定如何處理這個事件,那麼它需要有一些一些廣告的方式,它可以這樣做。一個簡單的方法是實現一個接口 - 但這意味着它只能有一個處理程序。但是,這意味着你可以使用接口的任何實現並讓它決定要做什麼。該界面將類似於事件處理程序委託簽名,基本上是:

public interface IEventHandler 
{ 
    void HandleEvent(object sender, EventArgs e); 
} 

然後,你可以這樣做:

IEventHandler handler = new B(); // Assuming B implements IEventHandler 
TestEvent += handler.HandleEvent; 

但我想不出任何時候,我真的想這樣做。你能否給我們提供更多關於大局的信息?