呼び出し元の情報取得

基本用法

Caller Info属性

.NET Framework 4.5 から追加された機能です
以下のサンプルコードのように、引数にinfo属性とデフォルト引数とを付与したパラメタを追加するこにより、コンパイル時に呼び出し元の情報を取得することができます。

・CallerMemberName 呼び出し元のメソッドやプロパティ名
・CallerFilePath  呼び出し元が定義されたファイルパス
・CallerLineNumber ソースファイルの行番号
    using System.Diagnostics;
    using System.Runtime.CompilerServices;
    
    class CallerSample
    {
        static void Main(string[] args)
        {
            WriteMessage("Test");
        }
 
        static void WriteMessage(string message,
        [CallerMemberName] string name = "",
        [CallerFilePath] string path = "",
        [CallerLineNumber] int line = 0)
        {
            Console.WriteLine($"Message:{message} ,Name:{name} , path:{path} ,line:{line}");
        }
    }

コールスタックから動的に取得する

メソッドを呼ぶ毎にスタックが積まれます。この情報から呼び元の情報を動的に取得することが可能です。
但し、難読化や最適化により想定外の値となってしまう場合があります。
CallerInfo属性の機能追加で出番はほとんどなくなりました。

    using System.Diagnostics;

    class CallerSample
    {
        static void Main(string[] args)
        {
            WriteMessage("Test");
        }
 
        static void WriteMessage(string message) 
        {
            StackFrame frame = new StackFrame(1);
            string className = frame.GetMethod().ReflectedType.FullName;
            string method = frame.GetMethod().Name;
             
            Console.WriteLine("Message:{message} ,Class:{className} ,Method:{method}");
        }
    }
基本用法
スポンサーリンク
C#プログラミング再入門