2009-08-29 20 views
6

カスタムのTrace属性を持つメソッドをデコレートできるようにするため、コンパイル時にそのメソッドにコードを挿入する必要があります。例えばコンパイル時にC#コードを挿入する方法は?

[Trace] 
public void TracedMethod(string param1) 
{ 
    //method body 
} 

になるべきである:この場合

public void TracedMethod(string param1) 
{ 
    Log.Trace("TracedMethod", "param1", param1); 
    //method body 
} 

は、注入されたコードは、メソッド名及びメソッドのパラメータに依存するので、この情報を推測することが可能であるべきです。

これを達成する方法を知っている人はいますか?

答えて

13

C#でアスペクト指向プログラミングを行うには、PostSharpを使用できます。

The homepageも、あなたが求めているだけのように、Trace例を示しています!)

+0

私はPostSharpenedコードのパフォーマンスを決して研究したことはありませんが、PostSharpシムが大きな違いを生み出したら驚くでしょう。 – RichieHindle

+0

私はPostSharp Loas(PostSharp用のAOPプラグイン)でやりたいことはできませんが、私はPostSharp用のカスタムAOPプラグインを書くことでそれを行うことができます。 PostSharp Loasは実行時のパフォーマンスに影響を与えるかもしれませんが、私のカスタムプラグインはコンパイル時のみであるため、実行されません。 –

2

これは、簡単にプログラム変換システムで行うことができます。

DMS Software Reengineering Toolkitは、一般的なプログラム変換システムであり、多くの言語(C++、COBOL、Java、EcmaScript、Fortran、..)、特にC#で使用できます。

DMSは抽象構文木を構築し、ソースからソースへのパターンを適用して、任意のプロパティを使用してコードをあるC#プログラムから別のものに変換することができます。正確にあなたが指定したタスクは次のようになり達成するための変換ルール:

domain CSharp. 

insert_trace():method->method 
    "[Trace] 
    \visibility \returntype \methodname(string \parametername) 
    { \body } " 
     -> 
    "\visibility \returntype \methodname(string \parametername) 
    { Log.Trace(\CSharpString\(\methodname\), 
       \CSharpString\(\parametername\), 
       \parametername); 
     \body } " 

引用符( ")CSHARP引用符ではありません。むしろ、それらは、『ドメイン引用符』、および引用符内のそのコンテンツを示しています\ fooという表記は、メタ構文です。CSHARP構文(我々が言ったので、「ドメインCSHARP」)である。

このルールは、あなたがで[トレース]注釈をを指定したメソッドを表すASTと一致し、にそのASTを書き換え結果のASTは、ソース形式にプリポートされ、コンパイルすることができます。他の引数の組み合わせを扱うためにはおそらく他の規則が必要です; f実際には、引数処理を一般化して、各スカラー引数の文字列値を(実用的なところで)生成することになります。

あなたが任意の変換だけでなく、アクションの前に、後を表現することができますので、あなたは、単にアスペクト指向プログラミングよりも、これだけでログインするよりも多く、そしてより多くを行うことができます明確にする必要があります。

+0

これは非常に便利に聞こえるが、私はそれが無料とソースへのアクセスなので最初PostSharpを試してみるつもりです。私はまた、任意のポイントで属性の名前を変更することができ、何も破壊することはできません。 –

+0

属性の名前が変更されたために、なぜあなたは反論していますか?属性の名前を変更したい場合は、実際にそれを行うためのプログラム変換を記述することもできます。 –

関連する問題