Использование обработчика событий в C++/CLI

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

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

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

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

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


person manu_dilip_shah    schedule 14.03.2012    source источник


Ответы (3)


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

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

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

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

person Moo-Juice    schedule 14.03.2012
comment
Здесь, во втором случае, мы должны явно определить методы добавления, удаления и повышения?? - person manu_dilip_shah; 14.03.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‹> вместо исходного неуниверсального. Это больше кода, чем простой подход, но он очень удобен для программиста клиентского кода, он сразу узнает, как использовать ваше событие, поскольку оно следует стандартному шаблону.

person Hans Passant    schedule 14.03.2012

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

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

someEvent(это, System::EventArgs::Empty)

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

person Matthias    schedule 14.03.2012