LoginSignup
39
38

More than 5 years have passed since last update.

C# メソッドの呼び出し元メソッド名を取得するおまじない

Last updated at Posted at 2015-06-19

こねたです。

以下のようにするとログ出力のときに、呼び出し元メソッド名まで出力できます。
(と書いたけど、改めて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を利用した方が良いかもしれません。

39
38
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
38