[英]c#, .net, delegate, asynchronous callback. What am I doing wrong here?
这是游戏菜单中按钮的一个小类。
我希望能够在实例化每个按钮时传递委托方法_triggerMethod。 然后,当该按钮实例触发方法被调用时,该委托方法将被调用。
我在这里第一次尝试使用C#进行委托。 就我在这里解释文档而言,我正在做的事情应该可以工作,但是Visual Studio在Trigger方法中给了我一个编译错误。
根据msdn的文章,调用委托的代码不需要了解参数等的原始方法。 我究竟做错了什么? 同样在msdn文章中,他们只键入“ Del”,这对我不起作用。 我必须输入“ Delegate”,这很奇怪。
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();
}
}
您尚未创建任何委托定义。
示例(从您链接的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");
}
您可以传递委托的引用而无需实际知道期望的参数(因为它只是一个普通引用),但是当您要调用它时,确实需要为其提供正确的参数。
如果要使用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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.