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() メソッドのオプショナルパラメータに渡されていることが確認できました。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 C# 入門