2

これが私が取り組んでいるものです:

私のプロジェクトの一部は、Windowsフォームアプリです。基本的に、発火してリスナーがいるすべてのイベントをキャプチャしたいと思います。つまり、いくつかのボタンのクリックイベント、いくつかのチェックボックスのチェックイベント、基本的な「コントロール」イベントリストのすべてです。そのため、そのイベントは引き続き発生しますが、私のイベントも発生します。

私が利用できる内部の一般的な「イベント発生」イベントはありますか、またはリフレクションを使用してフォーム内のすべてのオブジェクトを列挙し、すべてのイベントを解析し、リスナーを持つものを解析してから、すべてをサブスクライブする方法はありますか?彼らはすでに行っている場所に加えて、他の場所で一般的なイベントにそれらを?

誰もがこれを行う方法を知っていますか?

4

2 に答える 2

4

基本的にこれを行うことはできません。イベントは、「サブスクライブ」および「アンサブスクライブ」機能のみを備えたブラックボックスです。したがって、リフレクションを使用してすべてのイベントを見つけることはできますが、サブスクライブされているイベントを確実に検出することはできません。フィールドのようなイベントの場合、バッキングフィールドをフェッチして、それがnullかどうかを確認できますが、それでも信頼性はありません。nullチェックを回避するために、作成者は次のように記述している可能性があります。

public event EventHandler SomeEvent = delegate {};

他のイベントの場合、イベントのサブスクライブが実際に何を行うかを理解する必要があります。たとえば、を使用する場合がありますEventHandlerList

基本的に、これを行う必要がないように、設計を再考する必要があります。

于 2010-09-10T16:13:39.907 に答える
0

サブスクライブされたイベントが発生したという事実は、それがサブスクライバーを持っていることを示していませんか?したがって、必要なのは、サブスクライブ可能なイベントのリストだけです。これは、の間に検証できますintercepted call

任意のAOPフレームワークを使用して呼び出しを傍受できます。たとえば、を使用するUnity Interceptionと、次のようなことができます。

public IMethodReturn Invoke(IMethodInvocation input, 
    GetNextHandlerDelegate getNext)
{
    // 1. assuming that you are keeping a list of method names 
    // that are being subscribed to.
    // 2. assuming that if the event is fired, then it must have
    // been subscribed to... 
    if (MyReflectedListOfSubscribedEvents.Contains(input.MethodBase.ToString())
    {
        HandleItSomeHow();
    }

    // process the call...
    return getNext().Invoke(input, getNext);
}
于 2010-09-10T17:57:00.297 に答える