ヘッダー
C# サンプル集
 

現在実行中のメソッド名などの情報を取得する

2020/11/8

→ Visual Basic のサンプルに切り替える

 

 

現在実行中のメソッド名を取得する

public void Test()
{
    System.Diagnostics.Debug.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name + "を実行中です。");
}

実行すると「Test を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

  • コンストラクターやプロパティの場合、通常フレームワークによって隠蔽されている名前を取得します。下記の表の通りです。たとえば、コンストラクターでこの例を実行すると「.ctor」という名前を取得します。プロパティのgetで実行するとget_プロパティ名を取得します。   
種類 取得する名前
メソッド メソッド名。
プロパティ get_プロパティ名 または set_プロパティ名。例:get_Enabled
コンストラクター .ctor
静的コンストラクター .cctor
デストラクター Finalize
演算子 op_演算子名。例:op_Addition

 

これでもできます。

この例を実行するにはファイルの先頭の方に using System.Runtime.CompilerServices; の記述が必要です。

public void Test()
{
    System.Diagnostics.Debug.WriteLine(this.GetCurrentMemberName() + " を実行中です。");
}

public string GetCurrentMemberName([CallerMemberName] string callerMethodName = "")
{
    return callerMethodName;
}

実行すると「Test を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

参考:呼び出し元情報

  • こちらの例ではコンパイル時に文字列として呼び出し元メソッド名が埋め込まれるため、上記の例より性能が良いです。
  • コンストラクターやプロパティが呼び出し元の場合、通常フレームワークによって隠蔽されている名前を取得します。上掲の表を参照してください。

 

これでもできます。

public void Test()
{
    System.Diagnostics.Debug.WriteLine(nameof(Test) + " を実行中です。");
}

実行すると「Test を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

  • プログラマーによって明示的に定義された名前のみを対象にできます。

 

これでもできます。

public void Test()
{
    var caller = new System.Diagnostics.StackFrame(0, false);
    System.Diagnostics.Debug.WriteLine(caller.GetMethod().Name + " を実行中です。");
}

実行すると「Test を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

  • コンストラクターやプロパティの場合、通常フレームワークによって隠蔽されている名前を取得します。上掲の表を参照してください。

 

 

現在実行中のクラス名を取得する

var caller = new System.Diagnostics.StackFrame(0, false);
string callerClassName = caller.GetMethod().DeclaringType.FullName;

System.Diagnostics.Debug.WriteLine(callerClassName +  " クラスを実行中です。");

実行すると、たとえば「ConsoleApp1.TestClass クラスを実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

 

 

現在実行中のファイル名を取得する

この例を実行するにはファイルの先頭の方に using System.Runtime.CompilerServices; の記述が必要です。

public void Test()
{
    System.Diagnostics.Debug.WriteLine(this.GetCurrentSourceFileName() + " を実行中です。");
}

public string GetCurrentSourceFileName([CallerFilePath] string callerFilePath = "")
{
    return callerFilePath;
}

実行すると、たとえば「C:\Users\rucio\Source\Repos\ConsoleApp1\TestClass.cs ファイルを実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

  • ファイル名は、コンパイル時点でアセンブリ(exeファイルやdllファイル)内に文字列として埋め込まれます。そのため、開発者のパソコンとは異なるパソコンで実行しても、コンパイル時点で開発者のパソコンに存在していたソースコードのファイル名を取得します。ユーザー名など機密情報を含むパスを埋め込まないように注意してください。

 

 

現在実行中の行番号を取得する

次の例では、Debug.WriteLineの行の行番号をを出力します。

この例を実行するにはファイルの先頭の方に using System.Runtime.CompilerServices; の記述が必要です。

public void Test()
{
    System.Diagnostics.Debug.WriteLine(this.GetCurrentLineNumber().ToString() + " 行目を実行中です。");
}

public int GetCurrentLineNumber([CallerLineNumber] int callerLineNumber = 0)
{
    return callerLineNumber;
}

実行すると、たとえば「7 行目を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

 

これでもできます。

public void Test()
{
    var caller = new System.Diagnostics.StackFrame(0, true);
    System.Diagnostics.Debug.WriteLine(caller.GetFileLineNumber().ToString() + " 行目を実行中です。");
}

実行すると、たとえば「7 行目を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所

  • C# 5.0(2012年リリース)以降の場合、上記の最初の例の方が優れています。この例を採用する理由はありません。
  • デバッグビルド時のみ行数を取得できます。リリースビルドの場合行数は常に 0 になります。

 

 

参考:現在実行中のファイル名とメソッド名と行番号を取得する

この例はC# 7.0(2017年)以降で実行できます。ファイルの先頭の方に using System.Runtime.CompilerServices; の記述が必要です。

public void Test()
{
    var info = this.GetCurrentMethodInfo(); //←この行の情報を取得します。
    System.Diagnostics.Debug.WriteLine($"{info.FilePath}ファイルの{info.MethodName}{info.LineNumber}行目を実行中です。");
}

public (string MethodName, string FilePath, int LineNumber) GetCurrentMethodInfo(
    [CallerMemberName] string callerMethodName = "",
    [CallerFilePath] sstring callerFilePath = "",
    [CallerLineNumber] int callerLineNumber = -1)
{
&    return (callerMethodName, callerFilePath, callerLineNumber);
}

実行すると、たとえば「C:\Users\rucio\Source\Repos\ConsoleApp1\TestClass.csファイルのTestの11行目を実行中です。」と表示されます。→ Debug.WriteLineが表示される場所