C# 入門

ホーム > C# の基礎 > 呼び出し情報の取得

呼び出し情報の取得

スポンサーリンク

今回紹介する機能は .NET Framework 4.5 で導入された C# 5.0 からの新機能です。

.NET Framework 4.5 なので Visual Studio 2012 以降ということになります。

呼び出し情報を取得する機能です。

呼び出し情報というのは、具体的に言えば、あるメソッドを呼んだメソッド名、ソースのファイル名、行番号の情報ということです。

例えば、Foo と Bar というメソッドがあって、Foo の中で Bar を呼んだとします。

この場合、Bar での呼び出し元の情報は、Foo メソッド、Foo が書いてあるソースファイル名、行番号ということになります。

具体的には System.Runtime.CompilerServices で定義される次の属性を、引数に指定します。

CallerMemberName呼び出し元のメソッド名
CallerFilePath呼び出し元のファイル名
CallerLineNumber呼び出し元の行番号

引数にこれらを属性と指定して、その引数をオプショナルにしておくだけです。

それでは実際に利用するサンプルコードを見てみましょう。

Program.cs は次のようにします。

using System;
using System.Runtime.CompilerServices;

partial class CallerInfo1 {

    static void Main( string[] args ) {
        Foo();
    }

    static void Bar(
        int i,
        [CallerMemberName] string callerMemberName = "",
        [CallerFilePath] string callerFilePath = "",
        [CallerLineNumber] int callerLineNumber = 0) {
        Console.WriteLine( "Entering Bar()" );
        Console.WriteLine( " i = {0}", i );
        Console.WriteLine( " -- Caller Info --" );
        Console.WriteLine( " MemberName: {0}" , callerMemberName);
        Console.WriteLine( " FilePath: {0}", callerFilePath);
        Console.WriteLine( " Line#: {0}", callerLineNumber);
        Console.WriteLine( "Exit Bar()" );
    }

}

また、CallerInfo1.cs は次のようにします。

partial class CallerInfo1 {
    static void Foo() {
        Bar(5);
    }
}

呼び出し元 (Foo) と呼び出される側 (Bar) をそれぞれ別のファイルとするために、ここでは class の前に partial を付けてパーシャルクラスとして、クラス定義を複数のファイルで行なっています。

この実行結果は次のようになりました。

Entering Bar()
 i = 5
 -- Caller Info --
 MemberName: Foo
 FilePath: c:\src\test\csharp\CallerInfo1\CallerInfo1.cs
 Line#: 3
Exit Bar()

確かに Bar はこのファイル、この行から呼ばれています。

尚、呼び出し元の情報は実行時ではなく、コンパイル時に決定されます。

ILDasm で EXE をみてみると、確かに 5, "Foo", @"C:\src...", 3 を順番に積み上げてから Bar を呼び出していることが分かりますね。

スポンサーリンク
ホーム > C# の基礎 > 呼び出し情報の取得