- ベストアンサー
イベントにAddHandlerされているか判断
現在VB2010にてコントロールを作成しているのですが、 外部公開しているイベントに (コントロール利用側プログラムで)AddHandlerが 行われているかどうか判断する必要がでてしまいました。 どのようにすれば実装可能でしょうか? よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が > 必要になると思いますが、 > そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか? イベントハンドラを登録する側のコードに変化はありません。 イベントに対してAddHandlerする場合, 対象イベントがCustom Eventであろうがなかろうが同一コードになります。 # というか,おそらくMSILレベルで同一。 そして,イベントにハンドラが登録されているかどうかを調べる方法は, イベントを実装する側で登録の有無を記録することが唯一の方法になります。 # No.2さんのリフレクションによる方法は,内部実装の変化に追従できない。 イベントへの登録の有無が必要になるのは a. イベントを持つクラス b. イベントハンドラを登録するクラス c. 上記以外のクラス のどれでしょうか。 aであればCustom Eventにして事が足ります。 修正するのはイベントを持つクラスになります。 bであればAddHandlerのタイミングでフラグを立てれば事が足ります。 修正するのはイベントハンドラを登録するクラスになります。 cであればCustom Eventにしてさらにプロパティで外部に登録されているかを公開することになります。 修正するのはイベントを持つクラスとそのクラスを使うクラスになります。 ただし,最初に構成を見直すことをやはりお薦めします。 ハンドラの有無の確認は,C#でイベントを書いている場合くらいしか必要になるとは思えないので。 # C#ではRaiseEvent相当がないので,if (Event != null) Event(this, e);みたいに書かざるをえない。
その他の回答 (2)
- todo36
- ベストアンサー率58% (728/1234)
- Yune-Kichi
- ベストアンサー率74% (465/626)
根本的には仕様の見直しをすべきですが……。 外部のプログラムは自分がコールバックが欲しいイベントに対して登録するのですから,判断が必要な状況自体がおかしいわけです。 それはともかく……。 どうしても必要ならば,Custom Eventを使えばAddHandlerやRemoveHandlerのタイミングを捉えることができます。 http://msdn.microsoft.com/ja-jp/library/6hwhs172.aspx EventHandler型のフィールドをバックグラウンドとしてもっておいて, AddHandlerでCombine/RemoveHandlerでRemoveし, さらに判定用のプロパティを用意して, そのプロパティではフィールドがNothing「ではない」かどうかを返せばよいと思います。
補足
Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が 必要になると思いますが、 そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか? コントロールがすでに提供済みの為、 呼元側に手を加えずに、対応しないと行けない状態なのです。 後出して申し訳ありませんが、よろしくお願いします。
お礼
返事遅れてすみません。 上記の件を色々検証したのですが、どうもうまくいかないため 結局、ご指摘通り、別仕様で対応する事になりました。 色々ありがとうございました。