C# - 在声明类之外调用事件

时间:2013-07-02 13:02:07

标签: c# events compiler-construction derived-class

我在类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的代码中解雇那个事件?

3 个答案:

答案 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);
        }
    }