C# メソッドの呼び出し情報の取得
呼び出し情報とは?
この機能は .NET Framework 4.5 で導入された C# 5.0 からの新機能です。.NET Framework 4.5 なので Visual Studio 2012 以降ということになります。
「呼び出し情報」というのは、あるメソッドを呼んだ時のメソッド名、ソースのファイル名、行番号の情報ということです。
例えば、Foo と Bar というメソッドがあって、Foo の中で Bar を呼んだとします。この場合、Bar での呼び出し元の情報は、Foo メソッド、Foo が書いてあるソースファイル名、行番号ということになります。
呼び出し情報の取得方法
C# の情報の取得に関してはコンパイラのサポートがあり、コンパイル時に呼び出し情報が必要な箇所に埋め込まれます。
具体的には System.Runtime.CompilerServices で定義される次の属性を、引数に指定します。
属性 | 渡される値 |
---|---|
CallerMemberName | 呼び出し元のメソッド名 |
CallerFilePath | 呼び出し元のファイル名 |
CallerLineNumber | 呼び出し元の行番号 |
引数にこれらを属性と指定して、その引数をオプショナルにしておくだけで、コンパイラが自動的に呼び出し情報を挿入します。
呼び出し情報を取得するサンプルコード
それでは実際に利用するサンプルコードを見てみましょう。
Program.cs は次のようにします。
using static System.Console;
using System.Runtime.CompilerServices;
partial class TestApp
{
static void Main(string[] args)
{
Foo();
}
static void Bar(
int i,
[CallerMemberName] string callerMemberName = "",
[CallerFilePath] string callerFilePath = "",
[CallerLineNumber] int callerLineNumber = 0)
{
WriteLine($" i : {i}");
WriteLine($"MemberName : {callerMemberName}");
WriteLine($" FilePath : {callerFilePath}");
WriteLine($" Line# : {callerLineNumber}");
}
}
CallerInfo1.cs は次のようにします。
partial class TestApp
{
static void Foo()
{
Bar(5);
}
}
呼び出し元 (Foo) と呼び出される側 (Bar) をそれぞれ別のファイルとするために、ここでは class の前に partial を付けてパーシャルクラスとして、クラス定義を複数のファイルで行なっています。
この実行結果は次のようになりました。
dotnet run
i : 5
MemberName : Foo
FilePath : /Users/user1/app1/CallerInfo1.cs
Line# : 5
確かに Bar() メソッドを呼び出しているのは、 CallerInfo1.cs というファイルの 5 行目の Foo() メソッドです。
それらの情報が Bar() メソッドのオプショナルパラメータに渡されていることが確認できました。