2013-04-19 8 views
24

メソッド名を効率的にログに記録する方法を探しています。スピードとメンテナンス性。私は、.Net 4.5 Caller Information attributesでスピード部分を除いてこの目的のためだけに公開されていると思います。私は、これらがSystem.Reflection.MethodBase.GetCurrentMethod()またはstackTrace.GetFrame(1).GetMethod()。Name(hereから取得)を使用することによる単なる構文的な糖であると感じています。 (または)これらの方法でもパフォーマンス上の利点はありますか?呼び出し元情報属性を使用してパフォーマンスが低下しました

C#では、コンパイル時にメソッド名を取得する方法がありますか(c++のように)?

+4

あなたが実際に彼らのパフォーマンスをプロファイリング、またはあなたは、単に問題ではないかもしれない問題を先取りしていることがありますか? –

+0

@DanielKelley私はパフォーマンスを測定していません。私は、Caller Information属性のカバーの下で何が起こっているのかを知りたかったのです。ダニエルは、コンパイル時に置き換えが起こると言いました。これは私が探しているものです。 – Imran

答えて

51

発信者情報の属性によって、C#コンパイラは発信者の名前をコールサイトに提供します。これはコンパイル時に発生し、反映は伴いません。

public void DoProcessing() 
{ 
    LogCall(); 
} 

public void LogCall([CallerMemberName] string memberName = "") 
{ 
    Console.WriteLine(memberName + " was called."); 
} 

はにコンパイルされます:

public void DoProcessing() 
{ 
    LogCall("DoProcessing"); 
} 

public void LogCall(string memberName) 
{ 
    Console.WriteLine(memberName + " was called."); 
} 
+0

これは私が探しているものです。早速の対応、ありがとうございました。古いバージョンの.NETでコンパイル時の置換えを実現する考えはありますか? – Imran

+1

[CallerMemberInfo]は、C#5コンパイラを使用している限り、どの.NETバージョンでも動作します。 http://stackoverflow.com/questions/13381917/is-the-callermembername-attribute-in-4-5-able-to-be-faked – Daniel

+0

リンクをありがとう。私は現在VS2012を必要とするC#5コンパイラを使用していません。 – Imran