我可以委托一个事件并且也可以调用它吗?

时间:2011-01-24 09:03:39

标签: c# .net events delegates

我知道我可以将我的活动的订阅委托给另一个活动,

public event EventHandler MyEvent
{
    add { SomeClass.AnotherEvent += value; }
    remove { SomeClass.AnotherEvent -= value; }
}

在这种情况下,如果引发AnotherEvent,则也会引发MyEvent

然而,在我的课堂上,我不能像往常一样自己提升MyEvent(),因为它说:  Error 3 The event 'MyEvent' can only appear on the left hand side of += or -=

我认为这是因为上面的订阅授权。

我可以委托订阅以及自己调用吗?我们的目标是通过两件事AnotherEvent以及我自己的代码来提升MyEvent。

4 个答案:

答案 0 :(得分:4)

是的,你可以 - 但你需要自己的委托变量。您可以订阅SomeClass.AnotherEvent一次,并在引发该事件时调用您自己的代理,或只是让订阅者两次:

private EventHandler myEvent;

public event EventHandler MyEvent
{
    add
    {
        myEvent += value;
        SomeClass.AnotherEvent += value;
    }
    remove
    {
        myEvent -= value;
        SomeClass.AnotherEvent -= value;
    }
}

请注意,如果您选择“订阅SomeClass.AnotherEvent一次”方法,当您第一次看到MyEvent的订阅时,您可能需要考虑订阅,并在取消订阅时取消订阅后myEvent变为空。在处置方面,这一切都变得非常棘手......

答案 1 :(得分:1)

你必须连接其他某类的活动..

// constructor or initializer..

SomeClass.AnotherEvent += (s,e)=>{
   if(MyEvent != null){
      MyEvent(s,e);
   }
};

// let this be implicit default event
public event EventHandler MyEvent;

protected void RaiseMyEvent(){
    if(MyEvent != null){
        MyEvent(this,EventArgs.Empty);
    }
}

答案 2 :(得分:0)

您需要调用委托本身,而不是事件属性。由于MyEvent没有支持字段,这意味着您必须调用SomeClass.AnotherEvent的支持字段,通常只有SomeClass可以执行。正如其他人所说,有办法解决这个问题。看看他们的答案。

答案 3 :(得分:0)

我认为你不能,如果可以的话,我不认为这是合乎逻辑的。所以我会正常实现这个事件,然后在你的类中添加一个事件处理程序来监听来自另一个类的事件。

你基本上是在一个类中,当一个内部发生的事情发生时会触发一个事件,并且某个事件发生在一个依赖类中。我认为实施应该反映这一点。例如:

public MyClass()
{
    this.other = new SomeClass;
    other.AnotherEvent += SomeClass_AnotherEvent;
}
public event EventHandler MyEvent;
private void SomeClass_AnotherEvent(object sender, EventArgs e)
{
     if (MyEvent != null)
         MyEvent(this, e); // I think that it would be most logical, that you do not pass the sender
}