c ++ / cli中用于混合托管/非托管的观察者模式

时间:2013-04-03 05:01:48

标签: c++-cli observer-pattern mixed-mode

我有一个包含C#UI,C ++ / CLI混合模式互操作包装器和一些本机c ++项目的系统。

我需要做的是设置一个系统,使本机c ++代码可以发送日志消息,UI可以报告它。

我使用this作为模板设置了本机IObservable,但C#代码不能成为观察者。我的想法是在C ++ / CLI中设置另一个观察者模式,它观察本地观察者,并让C#实现它。我使用this作为模板,但我很难将其转换为有效的C ++ / CLI。

ref class Observable
{
public:
Observable(void);
virtual ~Observable(void);

event System::EventHandler^ SomethingHappened;

void DoSomething() {
    System::EventHandler^ handler = SomethingHappened;
    //if (handler != nullptr)
    //{
        handler(this, System::EventArgs::Empty);
    //}//null check not permitted in C++/CLI
};

给出错误:C3918:要求SomethingHappened成为数据成员。 This is the MSDN page - 但我无法确定我做错了什么。

有什么建议吗?

谢谢, 梅拉妮

3 个答案:

答案 0 :(得分:0)

在C ++ / Cli中,使用“琐碎事件”时,不需要检查事件是否为空(并且不能)。该语言为您解决了这个问题。

见相关: Error C3918: Error wile checking event for being nullptr Does C++/CLI event have any listeners?

因此,对于您的情况,只需删除nullptr支票

即可

答案 1 :(得分:0)

您正在尝试使用C#语法。事件在C ++ / CLI中的工作方式略有不同,除了添加和删除访问器之外,它们还有 raise accessor。换句话说,一个触发事件的方法。如果您不提供显式版本,编译器会自动生成一个。这使得举办活动变得非常简单:

void DoSomething() {
    SomethingHappened(this, System::EventArgs::Empty);
}

答案 2 :(得分:0)

使用this,正确的做法是直接触发事件。像这样:

void DoSomething() {       
    SomethingHappened(this, System::EventArgs::Empty);
}