0

Class1 具有属性 [EventPublication("event1")] 的事件。Class2 和 Class3 继承自 Class1。

我想使用 [EventSubscription] 将 Method1 订阅到来自 Class2 的对象中的事件,并将 Method2 订阅到来自 Class3 的对象中的事件。

但在派生类中,事件的 EventPublication 名称相同。那么如何区分派生类中的事件呢?可能吗?

编辑: 也许我误解了关于 IoC 的一些明显的事情,或者我试图使简单的解决方案复杂化......我会尝试澄清我的问题。这是一些代码:

class BasePresenter
{
    [EventPublication("event")]
    public event Action action;

    public void Run()
    {
        someAction();

        if (action != null)
            action();
    }

    protected virtual void someAction()
    {

    }
}

class Presenter1 : BasePresenter
{
    protected override void someAction()
    {

    }
}

class Presenter2 : BasePresenter
{
    protected override void someAction()
    {

    }
}

class AnotherClass
{
    [EventSubscription("event", ThreadOption.Caller)]
    public void action1()
    {
        System.Windows.Forms.MessageBox.Show("Presenter1 started");
    }

    [EventSubscription("event", ThreadOption.Caller)]
    public void action2()
    {
        System.Windows.Forms.MessageBox.Show("Presenter2 started");
    }
}

另一个类中有 action1() 和 action2() 方法。我想在调用 Presenter1 Run() 方法的实例时触发 action1(),并在调用 Presenter2 Run() 方法的实例时触发 action2()。但是调用 Run() 方法会触发 action1 和 action2 方法。

4

1 回答 1

0

我不确定我是否理解这个问题。事件聚合有两个端点,一个发布者和一个订阅者。它们由您在属性中使用的字符串事件名称“连接”,仅此而已。

订阅可以在与发布相同的类中完成,尽管我不清楚您为什么要这样做,只需让基类调用派生类实现的虚拟方法就可以了。

如果你想使用事件并且你想知道事件源实例是否不是接收器实例,只需检查事件的源输入参数是否符合this以下几行:

[EventSubscription("myevent")]
public void OnEvent(object sender, EventArgs a)
{
    if(sender.Equals(this)) return;

    // do stuff here - the event came from another class instance
}
于 2015-08-25T13:35:07.830 回答