我知道我可以将我的活动的订阅委托给另一个活动,
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。
答案 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
}