他のメソッドのメソッドを透過的にC#でラップする方法はありますか?私はMooseの機能性によって達成されたものを達成したい:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:他のメソッドのラッピングメソッド
EDIT:透明で私は元の方法を変更することなく意味します。
他のメソッドのメソッドを透過的にC#でラップする方法はありますか?私はMooseの機能性によって達成されたものを達成したい:http://search.cpan.org/perldoc?Moose::Manual::MethodModifiersC#:他のメソッドのラッピングメソッド
EDIT:透明で私は元の方法を変更することなく意味します。
私はあなたがアスペクト指向プログラミングと呼ばれているものを探していると思います。これを助ける多くの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が直後に実行されます。
実際、これらは.NETでは「代理人」と呼ばれています。参照:助けを
を。
閉じる。しかし、私は元の方法を書き直すことなくそれを行う必要があります。これは私が透明であることを意味したものです。しかし、これはきちんとしています:) – rpkelly
いいえ、それはムースのやり方ではありません。いくつかのAOPライブラリを調べたいと思うかもしれません。
ダイナミックプロキシを使用することで同じ効果を得ることができます。例はCastle Dynamic Proxyです。
このようなフレームワークは、C#のリフレクション機能を利用して 'プロキシ'または 'ラッパー'クラスを構築します。だから、それを覚えておいてください。このために一定のオーバーヘッドがあります。あるいは、create classes statically via code generationできるフレームワークを使用することもできます。
一部の分離ライブラリでは、メソッドへの呼び出しを "detours"またはmockメソッドで置き換えることができる機能を実装しています。同じ機能を使用して、参照しているインターセプトを実装することができます。詳細については、以下の点を確認してください。
Rhino Mocks stubs and mocks are only good for interfaces?
恐ろしいリフレクションではおそらくできますが、私はそれがかわいいとは思わないでしょう... – Alxandr