Использование EventHandler в C ++ / CLI - PullRequest
2 голосов
/ 14 марта 2012

-Я пытаюсь использовать обработчик событий в c ++ / cli для выброса события, а затем подписать его в c #

class Mclass
{
 event System::EventHandler ^ someEvent;
 void ShowMessage(System::String ^)
 {
  someEvent(this,message);
 }
}

-но это выдает ошибку

ошибка C2664: 'managed:: Mclass :: someEvent :: повышение ': невозможно преобразовать параметр 2 из' System :: String ^ 'в' System :: EventArgs ^ '

Как исправить это

Ответы [ 3 ]

8 голосов
/ 14 марта 2012

Для типа делегата EventHandler в качестве второго аргумента требуется объект типа EventArgs, а не строка. Быстрый способ решить вашу проблему - объявить собственный тип делегата:

public:
    delegate void SomeEventHandler(String^ message);
    event SomeEventHandler^ someEvent;

Но это не так. NET способ. То, что начинается с создания собственного маленького вспомогательного класса, полученного из EventArgs, для хранения любых пользовательских аргументов события:

public ref class MyEventArgs : EventArgs {
    String^ message;
public:
    MyEventArgs(String^ arg) {
        message = arg;
    }
    property String^ Message {
        String^ get() { return message; }
    }
};

Который вы затем используете следующим образом:

public ref class Class1
{
public:
    event EventHandler<MyEventArgs^>^ someEvent;

    void ShowMessage(System::String^ message) {
        someEvent(this, gcnew MyEventArgs(message));
    }
};

Обратите внимание на использование универсального типа EventHandler <> вместо исходного неуниверсального. Это больше кода, чем простой подход, но он очень удобен для программиста клиентского кода, он сразу же узнает, как использовать ваше событие, поскольку оно следует стандартному шаблону.

3 голосов
/ 14 марта 2012

Как указывает winSharp93, подпись для System::EventHandler занимает System::EventArgs. Вы можете либо:

  1. Создайте собственный класс EventArgs, содержащий нужное вам строковое сообщение,

  2. Используйте свой собственный делегат вместо `System :: EventHandler ':

    delegate void MyDelegate(string^); event MyDelegate^ someEvent;

2 голосов
/ 14 марта 2012

Вы не можете передать строку в EventHandler в качестве второго параметра.

Вместо этого попробуйте:

someEvent (this, System :: EventArgs :: Empty)

Если вам нужно передать пользовательские данные, вы можете создать подкласс EventArgs и использовать System::EventHandler<TEventArgs>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...