C#で呼び出し元のメソッド名を取得する

C#でログ出力機能などを実装する際に、呼び出し元のメソッド名を出力したいことがあります。
下記のようなログクラスがあるとします。

1
2
3
4
5
6
7
public static class LoggerSample
{
    public static void Log(string message, string name)
    {
        Console.WriteLine($"{name}: {message}");
    }
}

これを例えばMainメソッド内で使用する場合、下記のように使用してみます。

1
2
3
4
static void Main(string[] args)
{
    LoggerSample.Log("Test", "Main");
}

すると、下記のように出力されます。
Main: Test

ただこれだとメソッド名を変えたときに変更し忘れる可能性があります。
なのでせめて下記のようにしたいところです。

1
2
3
4
static void Main(string[] args)
{
    LoggerSample.Log("Test", nameof(Main));
}

これならメソッド名を変えたときに一括変更が効きます。
万が一変更が漏れていてもビルドエラーになるので気付くことができます。

ただ、それでもいろいろなメソッドから呼ぶ際に毎回メソッド名を渡すのは面倒です。
そこで、CallerMemberName属性を使用します。
下記のように、引数nameに属性をつけます。

1
2
3
4
5
6
7
public static class LoggerSample
{
    public static void Log(string message, [CallerMemberName] string name = null)
    {
        Console.WriteLine($"[{name}] {message}");
    }
}

呼び出し元ではnameを渡さなくてもよくなるので、下記のようになります。

1
2
3
4
static void Main(string[] args)
{
    LoggerSample.Log("Test");
}

これでも出力内容は変わらず下記となります。
Main: Test

このようにCallerMemberName属性をつけることで自動で呼び出し元のメソッド名が渡されます。
ちなみに、下記のusingも必要です。

1
using System.Runtime.CompilerServices;

ログ機能などのように呼び出し元のメソッド名を取得したいときなど、知っていると便利です。

スポンサーリンク