0

这是游戏菜单中按钮的一个小类。

我希望能够在实例化每个按钮时传递委托方法 _triggerMethod。然后,当调用该按钮实例触发方法时,将调用该委托方法。

我在这里第一次尝试 C# 中的代表。就我在这里解释文档而言,我正在做的事情应该可以工作,但是 Visual Studio 在 Trigger 方法中给了我一个编译错误。

根据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();
        }
    }
4

2 回答 2

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");
    }

您可以传递委托的引用,而实际上并不知道它需要什么参数(因为它只是一个普通的引用),但是当您想要调用它时,您确实需要给它正确的参数。

于 2013-05-12T09:11:57.700 回答
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();
}
于 2013-05-12T09:11:43.177 回答