2015-02-13 2 views
0

Это для моего 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) 
    { 

Это метод в другом классе, который я хотел бы выполнить при получении сообщения.

Спасибо за помощь и извините, если это действительно глупый вопрос, я довольно новичок в этом.

ответ

0

Трудно понять, что было бы лучше здесь, поскольку вы предоставили такой маленький контекст. Все, что мы действительно знаем, это то, что у вас есть один класс (назовите его 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; 
    } 
} 

Непонятно из вашего сообщения, важно ли иметь отправителя оригинального события. Если это так, то IMHO Option #1 лучше, так как он обеспечивает прямой доступ к событию. Однако вы можете изменить Option #2 так, чтобы он прошел sender обработчику (в Channel_MessageReceived()), вместо null, который приведен в примере (null более идиоматичен для static event, но не обязательно).

Если ни один из этих вариантов не работает для вас, предоставьте лучший контекст. См. https://stackoverflow.com/help/mcve и https://stackoverflow.com/help/how-to-ask.

Смежные вопросы