0

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

我需要做的是设置一个系统,让原生 c++ 代码可以发送日志消息,并且 UI 可以报告它。

我使用它作为模板设置了本机 IObservable ,但是 C# 代码不能成为观察者。我的想法是在 C++/CLI 中设置另一个观察者模式,它观察本地观察者,并让 C# 实现它。我将此用作模板,但我正在努力将其转换为有效的 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 成为数据成员。 这是 MSDN 页面- 但我无法确定我做错了什么。

有什么建议么?

谢谢,梅兰妮

4

3 回答 3

0

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

请参阅相关: 错误 C3918:错误检查事件 是否为 nullptr C++/CLI 事件是否有任何侦听器?

因此,对于您的情况,只需删除nullptr检查

于 2013-04-03T17:07:07.570 回答
0

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

void DoSomething() {
    SomethingHappened(this, System::EventArgs::Empty);
}
于 2013-04-04T00:11:47.973 回答
0

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

void DoSomething() {       
    SomethingHappened(this, System::EventArgs::Empty);
}
于 2013-04-04T00:14:49.873 回答