1. ホーム
  2. c#

[解決済み】イベントハンドラはすでに追加されていますか?

2022-04-22 03:32:08

質問

オブジェクトにイベントハンドラが追加されたかどうかを判断する方法はありますか? 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 さんの提案のように。

しかし、これらのオブジェクトの委託と廃棄の方法を再検討し、この情報を自分で追跡する方法を見つけることができないかどうか確認する方がよいかもしれません。