2013-05-12 58 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(); 
} 
相关问题