设置事件时遇到问题

时间:2014-12-09 15:35:17

标签: c# events

在我的课堂上,我们学习如何在c#中使用事件。教授希望我们为“机器人”玩家状态设置活动。我想要做的是当我改变机器人的状态然后我希望该状态注册到事件方法。但是我在设置事件时遇到了问题。我收到这些错误

错误1

Operator '+=' cannot be applied to operands of type 'PracticeWithEvents.Program.PlayerActions' and 'method group'

错误2

Cannot convert method group 'OnIdleState' to non-delegate type 'PracticeWithEvents.Program.PlayerActions'. Did you intend to invoke the method?

我对整个活动注册相对较新,所以我相信我做得不对。我在网上看了但是找不到有同样问题的人。有人能帮助我理解我做错了什么吗?

这是我的代码,希望有所帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PracticeWithEvents
{
    class Program
    {
        /// <summary>
        /// Creating the states for the player
        /// </summary>
        public enum PlayerActions { IDLE, ATTACK, MOVE, DYING }
        /// <summary>
        /// creating our enum handler
        /// </summary>
        public static PlayerActions CurrentAction = PlayerActions.IDLE;

        static void Main(string[] args)
        {
            switch (CurrentAction)
            {
                case PlayerActions.IDLE:
                    CurrentAction += OnIdleState;
                    break;
                case PlayerActions.ATTACK:

                    break;
                case PlayerActions.MOVE:

                    break;
                case PlayerActions.DYING:

                    break;
            }
        }
        /// <summary>
        /// Logic for the Idle State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnIdleState(object sender, EventArgs e)
        {
            Console.WriteLine("IDLE");
        }
        /// <summary>
        /// Logic for the Attack State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnAttackState(object sender, EventArgs e)
        {
            Console.WriteLine("ATTACK");
        }
        /// <summary>
        /// Logic for the Move State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnMoveState(object sender, EventArgs e)
        {
            Console.WriteLine("MOVE");
        }
        /// <summary>
        /// Logic for the Dying State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnDyingState(object sender, EventArgs e)
        {
            Console.WriteLine("DYING");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

要发送事件的类必须包含某种类型的事件。事件的类型由您必须在某处定义的某个委托的签名定义。

然后,使用您的类(甚至是该类的一些实例)的代码将附加处理程序。这些处理程序将在事件触发时运行。当你的班级用户告诉它时,它就是一种“控制反转”,#34;在这里,我想让你运行这个代码,每当你触发这个事件时我就会把它交给你#34 ;。 +=语法来自的地方:您可以将多个处理程序附加到给定实例的事件中。

最后,根据您的需要,您可以继承EventArgs,以便每次事件触发时都可以传递自定义值或参数,以便客户端代码(提供处理程序的代码)可以获取有关事件。它是什么信息,取决于你的意图。

此外,您似乎对行动,事件和状态之间的区别感到困惑。这些是定义有限状态机的行为的原因。状态机具有有限数量的状态。从一个州到另一个州的变化由事件定义。每个州都有一个或多个事件,当这些事件发生时,确定性地导致另一个明确定义的状态发生变化。在此之后,您可以输入操作并退出操作。而且,AFAIK,您不需要正式的状态机来从基于事件的编程中受益。

对我来说,如何从当前的代码到我刚才写的一些工作实现,这有点模糊,但我想你可以搞清楚。如果没有,a much more complete explanation is here

希望这有帮助。