はじめに
今回はメソッドの呼び出し元情報を取得できるようになる3つの属性(CallerMemberName
・CallerFilePath
・CallerLineNumber
)を紹介したいと思います。
概要
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); } }
