что такое синтаксис C ++ / CLI для подписки на события? - PullRequest
6 голосов
/ 29 января 2009

Я обновляю старый код Managed C ++ такими строками:

instanceOfEventSource->add_OnMyEvent( 
    new EventSource::MyEventHandlerDelegate(this, MyEventHandlerMethod) );

, где

  • EventSource - класс, публикующий события
  • instanceOfEventSource является экземпляром этого класса
  • EventSource :: MyEventHandlerDelegate - тип делегата для события
  • MyEventHandlerMethod - это (нестатический) метод в текущем классе (экземпляром которого является «this») с сигнатурой, соответствующей EventSource :: MyEventHandlerDelegate

Каков правильный синтаксис для этого в C ++ / CLI?

Ответы [ 2 ]

7 голосов
/ 29 января 2009

Синтаксис похож на C #, другими словами, += перегружен, чтобы сделать это возможным:

instanceOfEventSource.MyEvent +=
    gcnew EventSource::MyEventHandlerDelegate(this, &MyClass::MyEventHandlerMethod);

Аналогично для удаления. Однако, в отличие от C #, вы не можете пропустить явное создание экземпляра делегата обработчика событий, так что это приводит к довольно длинному коду.

1 голос
/ 20 сентября 2015

Я просто потратил полчаса, пытаясь выяснить, как зарегистрировать статический метод в качестве метода обратного вызова для события. Хотя ОП специально не запрашивал регистрацию статических методов, это будет полезно для других, сталкивающихся с той же проблемой. Это на самом деле очень просто, в этом случае конструктор делегата принимает только один параметр для статического целевого метода.

Пример:

System::EventHandler^ h = gcnew System::EventHandler(&MyClass::MyStaticCallbackMethod);
...