【问题标题】:Having trouble changing event handler更改事件处理程序时遇到问题
【发布时间】:2015-04-14 00:47:51
【问题描述】:

这是为我的 irc 机器人准备的,我正在尝试将消息接收器事件更改为链接到我的其他类中的方法。

 private static void client_Connected(object sender, EventArgs e)
    {


            gamebot.LocalUser.JoinedChannel += LocalUser_JoinedChannel;
            gamebot.LocalUser.MessageReceived += LocalUser_MessageReceived;


    }

   // private static void newmessage(object sender, IrcChannelEventArgs e)
   // {
   //     e.Channel.MessageReceived += Hangman.MessageReceivedHangman;

  //  }
    private static void LocalUser_JoinedChannel(object sender, IrcChannelEventArgs e)
    {
        e.Channel.MessageReceived += Channel_MessageReceived;
        Console.WriteLine("Joined " + e.Channel + "\n");
    }

只是不确定如何在方法之外获取 channeleventargs,所以我可以更改事件。注释的方法显示了我需要的东西。

public static void MessageReceivedHangman(object sender, IrcMessageEventArgs e)
    {

这是我希望在收到消息时执行的不同类中的方法。

感谢您的帮助,如果这是一个非常愚蠢的问题,我很抱歉,我对这一切还是很陌生。

【问题讨论】:

    标签: c# events event-handling bots irc


    【解决方案1】:

    很难知道这里什么是最好的,因为您提供的上下文太少了。我们真正知道的是,您有一个类(称为class A)处理特定事件,而另一个类(称为class B)希望能够处理第一个类已经知道的事件。

    基于此,至少有几种可能对您有用。

    选项 #1:

    公开“加入”事件,以便第二个班级可以接收相同的通知并订阅频道的事件:

    class JoinedChannelEventArgs : EventArgs
    {
        public Channel Channel { get; private set; }
    
        public JoinedChannelEventArgs(Channel channel) { Channel = channel; }
    }
    
    class A
    {
        public static event EventHandler<JoinedChannelEventArgs> JoinedChannel;
    
        private static void LocalUser_JoinedChannel(object sender, IrcChannelEventArgs e)
        {
            e.Channel.MessageReceived += Channel_MessageReceived;
            Console.WriteLine("Joined " + e.Channel + "\n");
    
            EventHandler<JoinedChannelEventArgs> handler = JoinedChannel;
    
            if (handler != null)
            {
                handler(null, new JoinedChannelEventArgs(e.Channel);
            }
        }
    }
    
    class B
    {
        static void SomeMethod()
        {
            A.JoinedChannel += A_JoinedChannel;
        }
    
        private static void A_JoinedChannel(object sender, JoinedChannelEventArgs e)
        {
            e.Channel += MessageReceivedHangman;
        }
    }
    

    选项 #2:

    改为公开“收到消息”事件:

    class A
    {
        public static event EventHandler<IrcMessageEventArgs> AnyChannelMessageReceived;
    
        public static void Channel_MessageReceived(object sender, IrcMessageEventArgs e)
        {
            // Whatever other code you had here, would remain
    
            EventHandler<IrcMessageEventArgs> handler = AnyChannelMessageReceived;
    
            if (handler != null)
            {
                handler(null, e);
            }
        }
    }
    
    class B
    {
        static void SomeMethod()
        {
            A.AnyChannelMessageReceived += MessageReceivedHangman;
        }
    }
    

    从您的帖子中不清楚拥有原始事件的发送者是否重要。如果是,那么恕我直言Option #1 更好,因为它提供了对事件的直接访问。但是,您可以修改Option #2,使其将sender 传递给处理程序(在Channel_MessageReceived() 中),而不是示例中的nullnull 对于static event 来说更惯用,但是不是强制性的)。

    如果这些选项都不适合您,请提供更好的上下文。请参阅https://stackoverflow.com/help/mcvehttps://stackoverflow.com/help/how-to-ask

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多