プロが教えるわが家の防犯対策術!

現在VB2010にてコントロールを作成しているのですが、
外部公開しているイベントに
(コントロール利用側プログラムで)AddHandlerが
行われているかどうか判断する必要がでてしまいました。
どのようにすれば実装可能でしょうか?
よろしくお願いします。

A 回答 (3件)

根本的には仕様の見直しをすべきですが……。


外部のプログラムは自分がコールバックが欲しいイベントに対して登録するのですから,判断が必要な状況自体がおかしいわけです。

それはともかく……。
どうしても必要ならば,Custom Eventを使えばAddHandlerやRemoveHandlerのタイミングを捉えることができます。
http://msdn.microsoft.com/ja-jp/library/6hwhs172 …
EventHandler型のフィールドをバックグラウンドとしてもっておいて,
AddHandlerでCombine/RemoveHandlerでRemoveし,
さらに判定用のプロパティを用意して,
そのプロパティではフィールドがNothing「ではない」かどうかを返せばよいと思います。

この回答への補足

Custom Eventを用いた場合、DLL呼び元側で用意するなどの処置が
必要になると思いますが、
そうでは無く、コントロール側だけの実装で対応したいのですが無理でしょうか?

コントロールがすでに提供済みの為、
呼元側に手を加えずに、対応しないと行けない状態なのです。

後出して申し訳ありませんが、よろしくお願いします。

補足日時:2011/06/03 11:14
    • good
    • 0
    • good
    • 0

> 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);みたいに書かざるをえない。
    • good
    • 1
この回答へのお礼

返事遅れてすみません。
上記の件を色々検証したのですが、どうもうまくいかないため
結局、ご指摘通り、別仕様で対応する事になりました。
色々ありがとうございました。

お礼日時:2011/06/09 14:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています