こねたです。
以下のようにするとログ出力のときに、呼び出し元メソッド名まで出力できます。
(と書いたけど、改めてstackoverflowを見たら、.Net4.5からもっと簡単に取得できるみたいです。CallerMemberNameAttribute Class)
※ リリースビルドでこれを利用するためには、PDBファイルを生成しておく必要があります。
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
private void log(LogLevel logLevel, String message, params Object[] objs)
{
if (!isOutput(logLevel))
{
return;
}
const int callerFrameIndex = 2; // 2つ前の呼び出し元メソッド名.
System.Diagnostics.StackFrame callerFrame = new System.Diagnostics.StackFrame(callerFrameIndex);
System.Reflection.MethodBase callerMethod = callerFrame.GetMethod();
this.writeLog(DateTime.Now, logLevel, callerMethod.Name, message, objs);
}
public void info(String message, params Object[] objs)
{
log(LogLevel.Info, message, objs);
}
swiftで呼び出し元メソッド名を取得したいけど、StackFrameのようなものが取得できるのだろうか? => println(_FUNCTION_)
補足
コメントでリリースビルドでは例外が発生して動作しないと指摘を受けたので、ちょっと調べてみました。
MSDNのSystem.Diagnostics.StackFrameを確認すると、既定ではリリースビルドにはシンボル情報がないため、ファイル、メソッド名、行番号が取得できないようです。
現在C#の環境が手元にないので確認できませんが、stackoverflowを確認すると、リリースビルドでもPDBファイルを生成すると、シンボル情報を利用できるようです。http://stackoverflow.com/questions/628565/display-lines-number-in-stack-trace-for-net-assembly-in-release-mode/628590#628590
※ 上記stackoverflowにもありますが、リリースビルドの場合は最適化を抑止しないと、正しいメソッド名、行番号が取れない場合があります。
※※ 動作未確認ですが、MSDNにPDBについての記載がない点から、System.Runtime.CompilerServices.CallerMemberNameAttributeを利用した方が良いかもしれません。