2013-05-12 35 views
0

繼承人在遊戲中的菜單按鈕的小類。c#,.net,委託,異步回調。我在這裏做錯了什麼?

我想在實例化每個按鈕時能夠傳遞委託方法_triggerMethod。然後,當該按鈕實例觸發器方法被調用時,該委託方法將被調用。

我在這裏第一次嘗試在C#中的代表。而據我解釋文檔here我在做什麼應該工作,但Visual Studio給我一個編譯錯誤在觸發器方法。

根據msdn文章調用委託的代碼並不需要知道原始方法參數等。我究竟做錯了什麼? 另外在MSDN文章中,他們只輸入「Del」,這對我不起作用。我必須輸入很奇怪的「代表」。

class MenuItem 
    { 
     private Rectangle clickArea; 
     private string displayText; 
     private Vector2 _position; 
     private Delegate _triggerMethod; 

     public MenuItem(Vector2 pos,string txt,Delegate trig) 
     { 
      displayText = txt; 
      _position = pos; 
      _triggerMethod = trig; 
     } 

     public void Draw(SpriteBatch sb) 
     { 
     } 

     public void Select() 
     { 
     } 

     public void DeSelect() 
     { 
     } 

     public void IsMouseOnMe() 
     { 
     } 

     public void Trigger() 
     { 
      _triggerMethod(); 
     } 
    } 
+0

什麼編譯錯誤? – 2013-05-12 09:09:41

+0

「Method,delegate or event expected」..特意在這裏_triggerMethod(); – 2013-05-12 09:10:49

+0

也當我嘗試和調試時,我得到 – 2013-05-12 09:11:55

回答

2

您尚未創建任何委託定義。

示例(從MSDN頁您鏈接):

public delegate void Del(string message); 

然後,你需要使用它作爲您的類型:

** snip ** 
    private Del _triggerMethod; 

    public MenuItem(Vector2 pos,string txt,Del trig) 
    { 
     displayText = txt; 
     _position = pos; 
     _triggerMethod = trig; 
    } 
    ** snip ** 

    public void Trigger() 
    { 
     _triggerMethod("some message"); 
    } 

您可以通過周圍的委託的引用,而無需實際知道它期望的參數(因爲它只是一個正常的參考),但是當你想調用它時,你需要給它正確的參數。

1

您需要定義Del類型,如果你想使用它:

public delegate void Del(string message); 

public class MenuItem 
{ 
    private Del _triggerMethod; 
    public void Trigger() 
    { 
     _triggerMethod("Message"); 
    } 
} 

注意,您可以使用內置的Action<string>委託類型,而不是定義自己:

Action<string> _triggerMethod; 
_triggerMethod("Message"); 

如果您只使用Delegate類型,則可以使用DynamicInvoke來調用它:

public void Trigger() 
{ 
    _triggerMethod.DynamicInvoke(); 
}