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}");
}
}