我有一个包含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 - 但我无法确定我做错了什么。
有什么建议吗?
谢谢, 梅拉妮
答案 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);
}