我在类Alice
中有一个事件要在派生类Bob
中引发:
public class Alice
{
public event Action<object> ValueChanged;
}
public class Bob : Alice
{
public void method1(Alice bigAlice)
{
// raise ValueChanged event
// or
// raise ValueChanged event on bigAlice
}
}
编译器错误说如果我不在事件的声明类中,我只能使用+=
和-=
。我怎么能从Bob的代码中解雇那个事件?
答案 0 :(得分:8)
除了声明类之外的任何地方都不能引发事件。
在基类中创建一个受保护的方法,该方法引发事件并从子类中调用它。
答案 1 :(得分:4)
您可以公开受保护的方法来调用它:
public class Alice {
public event Action<object> ValueChanged;
protected void RaiseValueChanged(object o) {
if (ValueChanged != null) {
ValueChanged(o);
}
}
}
答案 2 :(得分:3)
你可以这样做,创建一个触发事件的受保护方法,并从Bob方法调用它。 编辑:删除了可能的竞争条件问题,如@spender
所示 public class Alice
{
public event Action<object> ValueChanged;
protected void OnValueChanged(object arg)
{
Action<object> temp = ValueChanged;
if (temp != null)
{
temp (arg);
}
}
}
public class Bob : Alice
{
public void method1()
{
object o = null;
OnValueChanged(o);
}
}