在 C++/CLI 中使用 Prism PubSub 样式事件

Using a Prism PubSub style event in C++/CLI

我正在尝试在 C++/CLI 中创建事件聚合器,我知道 C# 中的有效语法如下:

//C# code
public partial class Foo : UserControl, IView, IDisposable
{
    private IEventAggregator _aggregator;

    public Foo(IEventAggregator aggregator)
    {
        InitializeComponent();

        this._aggregator = aggregator;
        if (this._aggregator == null)
            throw new Exception("null pointer");

        _subToken =_aggregator.GetEvent<fooEvent>().Subscribe(Handler, ThreadOption.UIThread, false);
    }

    private SubscriptionToken _subToken = null;

    private void Handler(fooEventPayload args)
    {
        //this gets run on the event
    }
}

然而,直接将其转换为 C++/CLI 会在指示的行上给出错误 "a pointer-to-member is not valid for a managed class"。有解决方法吗?我认为这与 C# 生成 "Action".

的方式有关
//C++/CLI code
ref class Foo
{
public:
    Foo(IEventAggregator^ aggregator)
    {
        void InitializeComponent();

        this->_aggregator = aggregator;
        if (this->_aggregator == nullptr)
            throw gcnew Exception("null pointer");

        //error in the following line on Hander, a pointer-to-member is not valid for a managed class
        _subToken = _aggregator->GetEvent<fooEvent^>()->Subscribe(Handler, ThreadOption::UIThread, false); 
private:
    IEventAggregator ^ _aggregator;
    SubscriptionToken ^ _addActorPipelineToken = nullptr;

    void Handler(fooEventPayload^ args)
    {
        //this gets run on the event
    }
}

您需要显式实例化委托对象,而不是让 C# 为您执行此操作。

_subToken = _aggregator->GetEvent<fooEvent^>()->Subscribe(
    gcnew Action<fooEventPayload^>(this, &Foo::Handler), ThreadOption::UIThread, false); 
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                     Explicitly instantiate the delegate.
//                                 ^^^^                Object to call the delegate on.
//                                       ^^^^^^^^^^^^^ C++-style reference to the method.