在游戏的菜单中为按钮提供了一个小课程。
当我实例化每个按钮时,我希望能够传递委托方法_triggerMethod。然后,当调用按钮实例触发器方法时,将调用该委托方法。
我第一次在C#中试用代表。至于我正在解释文档here我正在做什么应该工作但是visual studio在Trigger方法中给了我一个编译错误。
根据msdn文章,调用委托的代码不需要知道原始方法paramaters等。我究竟做错了什么? 同样在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 :(得分: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 :(得分: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();
}