きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

C# × CallerMemberNameAttribute × 呼び出し元のメソッド名取得方法

この記事の目的

この記事では、
System.Runtime.CompilerServices.CallerMemberName属性の使い方のまとめ
を目的としています。

本題

  1. CallerMemberNameって便利
  2. 実装サンプル
CallerMemberNameって便利

呼び出し元のメソッド名を取得したいことってよくありますよね。
特にログの出力時などでしょうか。
そんな時、StackFrameクラスを使ってひとつ前の情報を取得する方法があります。というか、それしか知りませんでした。


が、それ以外にも選択肢があることがわかりました。


それが、CallerMemberName属性です。
これを利用することで、メソッドのオプション引数として呼び出し元のメソッド名やプロパティ名を定義できるようになります。
公式ドキュメントには以下のように説明されています。
https://msdn.microsoft.com/ja-jp/library/system.runtime.compilerservices.callermembernameattribute(v=vs.110).aspx

メソッドの呼び出し元のメソッドまたはプロパティの名前を取得できるようにします。

そのままですね(´・ω・`)
このCallerMemberName属性には、ほかに2つの仲間がいるので、あわせて覚えておきたいです。
f:id:kinakomotitti:20180225210813p:plain

実装サンプル

試しに、以下のようなクラスとメソッドを作成します。

 public static class TestClass
{
    private static void CallerTest([System.Runtime.CompilerServices.CallerMemberName]string propertyName = "")
    {
        Console.WriteLine(propertyName);
    }

    public static void Caller()
    {
        TestClass.CallerTest();
    }
}

上記のCallerメソッドを呼び出すと、コンソールには以下のように表示されます。
f:id:kinakomotitti:20180225210820p:plain
想定通りに、呼び出し元であるCallerメソッドの名前を取得してくれました。

まとめ

呼び出し元のメソッド名、行番号を取得したいというときは、Caller系属性で実現可能。
クラス名などのその他情報は取得できない。
ほかの情報も必要なばあいは、StackFrameを利用するのが良い。
参考)StackFrame
https://msdn.microsoft.com/ja-jp/library/system.diagnostics.stackframe(v=vs.110).aspx