[解決済み】イベントハンドラはすでに追加されていますか?
質問
オブジェクトにイベントハンドラが追加されたかどうかを判断する方法はありますか? SQLベースのセッションステートを使用するために、オブジェクトのリストをシリアライズしています。リスト内のオブジェクトのプロパティが変更されると、フラグを立てる必要がありますが、以前はイベントハンドラが適切に対処してくれました。 しかし現在、オブジェクトがデシリアライズされると、イベントハンドラが取得されません。
軽いイラつきから、オブジェクトにアクセスする Get プロパティにイベントハンドラを追加してみました。 5回ほど呼び出されているので、オブジェクトにアクセスするたびにハンドラが追加され続けているのだと思うのですが。
本当は無視してもいいくらい安全なんだけど、ハンドラがすでに追加されているかどうかをチェックして、一度だけ追加するようにしたほうが、よりすっきりするよね。
それは可能ですか?
EDIT: どのイベントハンドラを追加するかを完全にコントロールできるとは限らないので、nullをチェックするだけでは十分ではありません。
どのように解決するのですか?
定義クラスの外から、@Telos が言及しているように、EventHandler を使用できるのは
+=
または
-=
. そこで、定義クラスを変更できるのであれば、イベントハンドラが
null
- であれば、イベントハンドラは追加されていないことになります。もしそうでないなら、おそらくは
デリゲート.GetInvocationList
. イベントハンドラとして追加したいデリゲートと同じものがあれば、それが存在することがわかります。
public bool IsEventHandlerRegistered(Delegate prospectiveHandler)
{
if ( this.EventHandler != null )
{
foreach ( Delegate existingHandler in this.EventHandler.GetInvocationList() )
{
if ( existingHandler == prospectiveHandler )
{
return true;
}
}
}
return false;
}
そして、これは簡単に "ハンドラがなければ追加する" に変更することができます。イベントを公開しているクラスの内部にアクセスできない場合は、次のような方法を検討する必要があります。
-=
と
+=
Lou Franco さんの提案のように。
しかし、これらのオブジェクトの委託と廃棄の方法を再検討し、この情報を自分で追跡する方法を見つけることができないかどうか確認する方がよいかもしれません。
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み] エンティティフレームワークのタイムアウト
-
[解決済み] タイムアウトが発生しました。操作の完了前にタイムアウトが発生したか、サーバーが応答していない。ステートメントが終了しました
-
[解決済み] 例外がスローされたことを確認するためにAssertを使用するにはどうすればよいですか?
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] EntitySetの更新ができない - DefiningQueryがあり、<UpdateFunction>要素が存在しないため
-
[解決済み】ハンドラ「ExtensionlessUrlHandler-Integrated-4.0」のモジュールリストに「ManagedPipelineHandler」という不正なモジュールが存在する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました