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 に答える