如何在C ++ / CLI中清除事件订阅?

时间:2013-11-04 14:16:42

标签: .net events c++-cli

我有一个Foo类,它有一个公共事件Bar。我需要清除对Bar的所有订阅。

在C#中它就像(在Foo类中)一样简单:

public void RemoveSubscribers() { this.Bar = null; }

(另见this问题)

如何在C ++ / CLI中执行此操作?我无法将Bar设置为nullptr:编译器吐出错误

Usage requires 'Foo::Bar' to be a data member

我看过Bar的RemoveAll方法,但我不明白我应该提供什么作为参数......

编辑1: 为清楚起见,Bar声明如下:

public ref class Foo
{
public:
    event MyEventHandler^ Bar;
};

1 个答案:

答案 0 :(得分:1)

C ++ / CLI甚至在类中隐藏了底层后备存储(委托),因此您不能简单地将其设置为nullptr。因为您不能依赖默认事件实现,所以您必须自己完成:

private: EventHandler^ _myEvent;

public: event EventHandler^ MyEvent 
{
    void add(EventHandler^ handler)
    {
        _myEvent += handler;
    }

    void remove(EventHandler^ handler) 
    {
        _myEvent -= handler;
    }
}

现在您可以简单地取消myEvent委托:

_myEvent = nullptr;

这当然会改变你调用它的方式(与C#而不是C ++ / CLI短版本相同):

EventHandler^ myEvent = _myEvent;
if (myEvent != nullptr)
    myEvent(this, e);