2

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 的代码中触发该事件?

4

3 回答 3

8

除了声明类之外,不能在任何地方引发事件。

在您的基类中创建一个受保护的方法来引发事件并从您的子类中调用它。

于 2013-07-02T13:03:14.643 回答
4

您可以公开一个受保护的方法来调用它:

public class Alice {
  public event Action<object> ValueChanged;

  protected void RaiseValueChanged(object o) {
    if (ValueChanged != null) {
      ValueChanged(o);
    }
  }
}
于 2013-07-02T13:04:27.030 回答
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);
        }
    }
于 2013-07-02T13:05:27.750 回答