2011-02-01 1 views
5

他のメソッドのメソッドを透過的にC#でラップする方法はありますか?私はMooseの機能性によって達成されたものを達成したい:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:他のメソッドのラッピングメソッド

EDIT:透明で私は元の方法を変更することなく意味します。

+0

恐ろしいリフレクションではおそらくできますが、私はそれがかわいいとは思わないでしょう... – Alxandr

答えて

4

私はあなたがアスペクト指向プログラミングと呼ばれているものを探していると思います。これを助ける多くのC#ライブラリがあります。 1つはPostSharpと呼ばれています(PostSharpの無料版ではこの機能がサポートされています)。以下は、mooseの例に似た例です。これは、あなたがこの特別な機能にタックするために他の方法で使用することができますトレース属性を作成します。

[Serializable] 
public class TraceAttribute : OnMethodBoundaryAspect 
{ 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("about to call method"); 
    } 

    public override void OnExit(MethodExecutionArgs args) 
    { 
     Trace.WriteLine("just finished calling method"); 
    } 
} 

あなたはトレースを配置することにより、メソッド「フー」に追加します右のそれの前に属性:

[Trace] 
public void Foo() { /* ... */ } 

Fooが実行されると、上記のOnEntryメソッドがその前に実行され、OnExitが直後に実行されます。

+0

関数に渡されるときに引数を変更できますか?私はそれらを受け取ることがわかりますが、私はそれらを変更することができるかどうか私は文書からはわかりません。 – rpkelly

+0

@rpkelly - 具体的に何を議論することを望んでいますか? –

+0

私は関数とその戻り値の呼び出しをログに記録するだけでなく、関数に渡される "トランザクションID"の自動生成を処理する必要があります(現在は他の場所で生成されています)。 – rpkelly

2
+2

閉じる。しかし、私は元の方法を書き直すことなくそれを行う必要があります。これは私が透明であることを意味したものです。しかし、これはきちんとしています:) – rpkelly

0

いいえ、それはムースのやり方ではありません。いくつかのAOPライブラリを調べたいと思うかもしれません。

2

ダイナミックプロキシを使用することで同じ効果を得ることができます。例はCastle Dynamic Proxyです。

このようなフレームワークは、C#のリフレクション機能を利用して 'プロキシ'または 'ラッパー'クラスを構築します。だから、それを覚えておいてください。このために一定のオーバーヘッドがあります。あるいは、create classes statically via code generationできるフレームワークを使用することもできます。

0

一部の分離ライブラリでは、メソッドへの呼び出しを "detours"またはmockメソッドで置き換えることができる機能を実装しています。同じ機能を使用して、参照しているインターセプトを実装することができます。詳細については、以下の点を確認してください。

Rhino Mocks stubs and mocks are only good for interfaces?

http://research.microsoft.com/en-us/projects/moles/

http://www.typemock.com/typemock-isolator-product3/

関連する問題