はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】CallerMemberName, CallerFilePath, CallerLineNumberを用いてメソッドの呼び出し元の情報を取得する(メソッド名またはプロパティ名, パス, 行番号)

はじめに

今回はメソッドの呼び出し元情報を取得できるようになる3つの属性(CallerMemberNameCallerFilePathCallerLineNumber)を紹介したいと思います。

概要

CallerMemberName, CallerFilePath, CallerLineNumberを利用することで、メソッドの呼び出し元の情報を取得することができます。

  • CallerMemberName : メソッドの呼び出し元のメソッド名またはプロパティ名
  • CallerFilePath : 呼び出し元を格納するソースファイルの完全パス
  • CallerLineNumber : メソッドが呼び出される位置の行番号

CallerFilePath

呼び出し元を格納するソース ファイルの完全パスを取得できるようにします。 これは、コンパイル時のファイル パスです。

CallerFilePathAttribute クラス (System.Runtime.CompilerServices) | Microsoft Learn

CallerLineNumber

ソース ファイル内でメソッドが呼び出される位置の行番号を取得できます。

CallerLineNumberAttribute クラス (System.Runtime.CompilerServices) | Microsoft Learn

CallerMemberName

メソッドの呼び出し元のメソッド名またはプロパティ名を取得できます。

CallerMemberNameAttribute クラス (System.Runtime.CompilerServices) | Microsoft Learn

使い方

以下のサンプルのように、引数に属性をつけます。またデフォルト値を必須でつけないといけないことは注意してください。

またUnityを利用しているのでDebug.Logを利用していますが、Consoleアプリ等ではConsole.WriteLineに置き換えればOKです。

/// <summary>
/// メッセージをコンソールに出力する
/// </summary>
/// <param name="message">メッセージ</param>
/// <param name="memberName">メソッドの呼び出し元のメソッド名またはプロパティ名</param>
/// <param name="sourceFilePath">呼び出し元を格納するソースファイルの完全パス</param>
/// <param name="sourceLineNumber">メソッドが呼び出される位置の行番号</param>
public void TraceMessage(string message,
    [CallerMemberName] string memberName = "",
    [CallerFilePath] string sourceFilePath = "",
    [CallerLineNumber] int sourceLineNumber = 0)
{
    Debug.Log("message: " + message);
    Debug.Log("member name: " + memberName);
    Debug.Log("source file path: " + sourceFilePath);
    Debug.Log("source line number: " + sourceLineNumber);
}

実験

Unityで以下のコードを実行してみます。

public class Test : MonoBehaviour
{
    private void Start()
    {
        Hoge();
    }

    private void Hoge()
    {
        TraceMessage("何か問題が発生しました");
    }
    
    /// <summary>
    /// メッセージをコンソールに出力する
    /// </summary>
    /// <param name="message">メッセージ</param>
    /// <param name="memberName">メソッドの呼び出し元のメソッド名またはプロパティ名</param>
    /// <param name="sourceFilePath">呼び出し元を格納するソースファイルの完全パス</param>
    /// <param name="sourceLineNumber">メソッドが呼び出される位置の行番号</param>
    public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
    {
        // message: 何か問題が発生しました
        Debug.Log("message: " + message);

        // member name: Hoge
        Debug.Log("member name: " + memberName);
        
        // source file path: /Users/username/Test2022_3_0f1/Assets/Scripts/Test.cs
        Debug.Log("source file path: " + sourceFilePath);
        
        // source line number: 13
        Debug.Log("source line number: " + sourceLineNumber);
    }
}
動作している様子