現在の型で宣言されたフィールドのようなイベントである場合にのみ、イベントをテスト/呼び出すことができます。したがって、これを引き起こすシナリオは 2 つあります。
フィールドのようなイベントではありませんが、カスタムadd
/remove
アクセサーがあります。この場合、カスタム コードだけがデリゲートの格納方法を知っています。
現在の型では宣言されていませんが、基本型または関連のないオブジェクト内にあります。この場合、通常はOnCustomEvent
メソッドを介して、イベントを呼び出すために宣言型を取得する必要があります。基本型の場合、このメソッドを作成するのが慣例となり、protected virtual
サブクラスがイベントを呼び出してイベントにフックできるようになります。override
(コメント)
ケース1のようです。ただし、この問題を解決するために何をすべきかわかりません。
カスタムのadd
/がある場合、それを呼び出す方法は実装によって異なります ( /が表示されremove
ていれば詳細を説明できます) が、2 つの一般的な実装を見てみましょう。add
remove
1a: バッキング デリゲート:
private EventHandler someEvent;
public event EventHandler SomeEvent
{
add { someEvent += value; }
remove { someEvent -= value; }
}
この場合、「呼び出し」の実装は次のようになります。
if(someEvent != null) someEvent(this, EventArgs.Empty);
または、特に用心深い場合:
var handler = someEvent;
if(handler != null) handler(this, EventArgs.Empty);
1b: an EventHandlerList
(まばらなイベントに使用):
private static readonly object SomeEventKey = new object();
public event EventHandler SomeEvent
{
add { Events.AddHandler(SomeEventKey, value); }
remove { Events.RemoveHandler(SomeEventKey, value); }
}
この場合、呼び出しの実装は次のようになります。
var handler = (EventHandler)Events[SomeEventKey];
if(handler != null) handler(this, EventArgs.Empty);