私はこれを少し考えすぎているかもしれませんが、次のことを行う方法/最良の方法を特定するのにいくらかの助けを借りることができます.
別のクラスのプロパティであるオブジェクトにアタッチされたイベント ハンドラーがあります。私のイベント ハンドラーでは、イベントを引き起こしたオブジェクトに関する追加のメタデータ (つまり、イベントが含まれているオブジェクトの ID) が必要です。送信者とイベント情報から、必要な情報を取得する方法がありません。私の傾向は、これがキャプチャされた変数を使用するのに適した場所になるということでしたが、実装のアイデアがわかりません。
コードで説明するために、イベント ハンドラーがあります。
void MyEventHandler(object sender, EventArgs e){
//Do Stuff here
}
(注記として、ここではベース EventArgs を使用していますが、実際の実装では特殊なサブクラスであり、イベントはジェネリック EventHandler を使用して宣言されています)
私は現在、このようにそれを添付しています:
topObject.SubObject.EventToHandle += MyEventHandler;
後で次のように切り離します。
topObject.SubObject.EventToHandle -= MyEventHandler;
イベントを処理するときに topObject の ID が必要なので、MyEventHandler を次の署名を持つように変更します。
void MyEventHandler(int id, object sender, EventArgs e)
次のようにイベント ハンドラーをアタッチします。
topObject.SubObject.EventToHandle += (s,e) => MyEventHandler(topObject.ID, s,e);
それに関する私の懸念は2つあります。
- これがアタッチされている関数の外に出ると、ハンドラーが削除されずに実際に消えるスコープに問題がありますか。過去に、ラムダ式を使用したときにイベント ハンドラーが消えてしまう奇妙なエラーを見たことがあります。常にではなく、場合によってはそうです。それらのケースが何であるかについて誰かが私に教えてくれるので、私が持っていた構文をいつ安全に使用できるかがわかります。
- 正確には思い出せませんが、作成される暗黙的なオブジェクトが同じではないため、この構文を使用した場合、イベント ハンドラーを削除することはできないと思います。
これら 2 つの懸念事項があるため、アクションを作成してアクションを保存し、イベント ハンドラーを削除する必要があるまでそれを使用することを考えました。私は次のことをしました:
Action<object, EventArgs> handler = (s,e) => MyEventHandler(topObject.ID, s,e);
topObject.SubObject.EventToHandle += handler;
アクションをイベント ハンドラーにキャストできないことがわかりました。イベント ハンドラーをデタッチできることを保証するこの変換を行う簡単な方法はありますか? 私はこれを考えすぎているだけですか/これを行うために今見ていない方法はありますか?