c#,。net,委托,异步回调。我在这做错了什么?

时间:2013-05-12 09:04:36

标签: c# .net delegates

在游戏的菜单中为按钮提供了一个小课程。

当我实例化每个按钮时,我希望能够传递委托方法_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();
        }
    }

2 个答案:

答案 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();
}