2013-07-30 4 views
4

Хорошо, я действительно не знаю, что случилось с моим кодом и Что происходит такПередача обработчика событий в качестве параметра

class Activity имеет следующие методы

protected struct EventParams 
    { 
     public object sender; 
     public EventArgs e; 
    } 
private EventParams WaitEventRaise_Body(ref EventHandler<EventArgs> handler, int timeout) 
    { 
     AutoResetEvent receiver = new AutoResetEvent(false); 
     EventParams result = new EventParams(); 

     EventHandler<EventArgs> handle = new EventHandler<EventArgs>((sender, e) => 
     { 
      result.e = e; 
      result.sender = sender; 
      receiver.Set(); 
     }); 

     handler += handle; 

     if (timeout > 0) 
     { 
      receiver.WaitOne(timeout); 
     } 
     else 
     { 
      receiver.WaitOne(); 
     } 

     return result; 
    } 

protected EventParams WaitEventRaise(ref EventHandler<EventArgs> handler) 
{ 
    return WaitEventRaise_Body(ref handler, -1); 
} 
protected EventParams WaitEventRaise(ref EventHandler<EventArgs> handler, int timeout) 
{ 
    return WaitEventRaise_Body(ref handler, timeout); 
} 

Хорошо, так я считаю себя писать снова и снова снова AutoResetEvent, поэтому я решил создать метод. Но когда я пытаюсь вызвать этот метод из производного класса Bot : Activity

EventParams eventResult = WaitEventRaise(ref currentJob.JobReported); 

дает

Error 30 The best overloaded method match for Project.Activity.WaitEventRaise(ref System.EventHandler)' has some invalid arguments

currentJob является Job : Activity класс, который имеет событие

public event EventHandler<JobReport> JobReported; 

и

class JobReport : EventArgs 

Что я хочу сделать, так это то, что бот делает задания, на самом деле он создает рабочие места и ждет их для завершения своей работы. Класс Job вызывает событие внутри, чтобы класс бота заметил, что он завершил свою работу. И класс бота ждет, пока работа не активирует событие. Поэтому я надеюсь, что это ясно. И мне жаль, что английский не мой родной язык.

+0

'EventHandler ' не может быть выведено как 'EventHandler ', поэтому это не сработает. – James

+0

Это не работает для JobReport? класс JobReport: EventArgs – user1046403

+0

OK Я пытался использовать EventParams eventResult = WaitEventRaise (ref currentJob.test); , где общественное мероприятие EventHandler test; , и это дает мне ошибку: тест события может появляться только в левой части + = и т. Д. И т. Д. – user1046403

ответ

6

В принципе, вы не можете ссылаться на события, как что. Два варианта:

  • Pass в делегатов для "добавление обработчика" и "удаление обработчика":

    EventParams eventResult = 
        WaitEventRaise<JobReport>(handler => currentJob.JobReported += handler, 
               handler => currentJob.JobReported -= handler); 
    

    где WaitEventRaise будет объявлен как:

    EventParams WaitEventRaise<T>(Action<EventHandler<T>> add, 
               Action<EventHandler<T>> remove) 
              where T : EventArgs 
    
  • Pass в EventInfo соответствует событию, которое вы выбрали бы с отражением

Ни один из них не является ужасно приятным - это проблема, с которой сталкивается Rx.

+1

Jon Skeet ты мой герой спасибо! – user1046403

+0

Но нет ли короткого решения, я имею в виду, что я должен писать эти вещи снова и снова. Разве нет решения, которое я просто передаю, над чем мне нужно работать, и получить результат? Единственный метод, который я имею в виду: – user1046403

+0

@ user1046403: Нет. В основном события сами по себе не являются сущностями первого класса в C# (а также не являются свойствами или конструкторами ... методы - это методы преобразования групп методов). –

0

я не знаю, что Job класс содержит или что currentJob.JobReported есть, но, судя по ошибке WaitEventRaise метод нуждается в System.EventHandler, который является методом, как

private void MeMethod(object sender, EventArgs e) 
{ 
} 
Смежные вопросы