Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

こねたです。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした