ログ出力やデバッグ情報の記録において、「現在どのクラスの、どのメソッドを実行しているか」という情報をプログラム内で動的に取得したい場合があります。
C#のリフレクション機能の一部である MethodBase.GetCurrentMethod() を使用することで、ハードコーディング(文字列の直接記述)に頼らずに、現在の実行コンテキスト情報を取得可能です。
現在のメソッド情報取得の実装
System.Reflection 名前空間の MethodBase クラスを利用します。GetCurrentMethod() で現在のメソッド情報を取得し、その戻り値からメソッド名や、定義されているクラス(型)情報へアクセスします。
以下のサンプルコードでは、注文処理クラスにおいて、処理開始ログにクラス名とメソッド名を自動的に埋め込む例を示します。
サンプルコード
using System;
using System.Reflection;
namespace LogSample
{
class Program
{
static void Main()
{
var service = new OrderService();
service.CreateOrder();
service.CancelOrder();
}
}
public class OrderService
{
public void CreateOrder()
{
// 現在実行中のメソッド情報を取得
MethodBase currentMethod = MethodBase.GetCurrentMethod();
// クラス名を取得 (DeclaringTypeプロパティ経由)
string className = currentMethod.DeclaringType.Name;
// メソッド名を取得 (Nameプロパティ)
string methodName = currentMethod.Name;
Console.WriteLine($"[LOG] Start: {className}.{methodName}");
// ... 実際の注文処理 ...
}
public void CancelOrder()
{
// 省略して記述する場合
var method = MethodBase.GetCurrentMethod();
Console.WriteLine($"[LOG] Start: {method.DeclaringType.Name}.{method.Name}");
// ... キャンセル処理 ...
}
}
}
実行結果
[LOG] Start: OrderService.CreateOrder
[LOG] Start: OrderService.CancelOrder
解説と技術的なポイント
1. MethodBase.GetCurrentMethod()
現在実行されているコードのスタックフレームに対応するメソッドのメタデータを返します。静的メソッド(static)内でもインスタンスメソッド内でも同様に使用できます。
2. MethodBase.DeclaringType プロパティ
そのメソッドが定義されているクラス(または構造体)の Type オブジェクトを取得します。 クラス自体の名前を文字列で取得したい場合は、さらに .Name プロパティにアクセスします。 名前空間を含めた完全修飾名(例: LogSample.OrderService)が必要な場合は、.FullName を使用します。
3. MethodBase.Name プロパティ
メソッド自体の名前を文字列で返します。
注意点:パフォーマンス
リフレクションを使用した情報の取得は、通常のコード実行に比べて処理コスト(オーバーヘッド)がかかります。 ミリ秒単位の速度が要求されるループ処理の中など、高頻度で呼び出される箇所での使用は避け、例外発生時のログ出力など、頻度が限定される場面での利用が推奨されます。
なお、C# 5.0以降では、[CallerMemberName] 属性などを使用するコンパイラ機能(Caller Information)があり、パフォーマンスを重視する場合はそちらの利用も検討してください。
