14

Microsoft.Practices.CompositeUI.EventBroker を使用して、アプリケーションでイベントのサブスクリプションとパブリケーションを処理しています。これが機能する方法は、次のようにトピック名を指定して、イベントに属性を追加することです。

[EventPublication("example", PublicationScope.Global)]
public event EventHandler Example;

次に、次のように、同じトピック名で別の属性をハンドラーに追加します。

[EventSubscription("example", ThreadOption.Publisher)]
public void OnExample(object sender, EventArgs e)
{
    ...
}

次に、すべてを一致させる EventInspector にオブジェクトを渡します。

これをデバッグする必要があるため、すべてのイベントをサブスクライブするデバッグ クラスを作成しようとしています。すべてのトピック名のリストを取得できます...ただし、実行時のみです。したがって、デバッグ オブジェクトを EventInspector に渡す前に、実行時にメソッドに属性を追加できる必要があります。

実行時にメソッドに属性を追加するにはどうすればよいですか?

4

4 に答える 4

11

あなたが達成しようとしていることは非常に複雑です。これは、何かを達成するために組み合わせる必要があると思うものです。

  1. すべてのメンバーを検索し、それらを EventInspector に登録するAbstractEventDebuggerメソッドを使用して、抽象クラスを定義します。また、それを呼び出したイベントを識別できるようにするメソッドを定義します (これは、あなた次第です - どのパラメータを持つかなど)。SearcheventIdentifyEvent
  2. クラスから継承するdynamic typeusing をTypeBuilder(ここで説明されているように)定義します。このクラスは、debuggerオブジェクトのクラスになります。
  3. Reflection.Emit.MethodBuilder(こちらを参照)を使用してクラスにハンドラーをアタッチします。これIdentifyEventにより、親クラスからメソッドが呼び出されます。
  4. Reflection.EmitCustomAttributeBuilderクラスを使用したハンドラーの属性(こちらを参照)。
  5. クラスのインスタンスを作成dynamicし、EventInspector に送信します。
  6. 火をつけろ:)

何かを呼び出すメソッドを作成する方法のサンプルを次に示します (実際には、これは古典的な "Hello world" です)

うまくやり遂げるには多くの微調整が必​​要ですが、リフレクションについて多くのことを学ぶことができます。

幸運を!

于 2008-11-06T12:52:30.617 に答える
3

属性はコンパイル時の機能です (ComponentModel を扱っている場合を除きますが、リフレクションを使用していると思われます)。したがって、実行時に属性を追加することはできません。「実行時に型に追加のメソッドを追加するにはどうすればよいですか?」と同様の質問になります。通常の C# / .NET (DLR 以前) ではできません。

于 2008-11-06T12:21:59.507 に答える
1

EventInspectorは、(WorkItemに格納されている)EventTopicsを使用して、すべての手間のかかる作業を行います。各EventTopicオブジェクトは、と呼ばれるTraceSourceにアクセスできます。

Microsoft.Practices.CompositeUI.EventBroker.EventTopic

次のようにapp.configファイルで有効にできます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <switches>
            <add name="Microsoft.Practices.CompositeUI.EventBroker.EventTopic" value="All" />
        </switches>
    </system.diagnostics>
</configuration>

これにより、多くの有用なメッセージがVisualStudioのデバッグウィンドウにルーティングされるようになります。VSデバッグウィンドウを超えたい場合は、たくさんのオプションがあります。次の記事をチェックすることをお勧めします。

TraceSourceを使用したコードインストルメンテーションMyPersoanlVade Mecum

于 2008-11-06T13:43:35.940 に答える
1

の世界を掘り下げる必要がありDynamicMethodます。ただし、MSIL を理解する必要があるため、アーキテクチャについてよく考えることを強くお勧めします。

于 2008-11-06T12:24:46.613 に答える