C#における、実行中のクラス・メソッド・行番号を取得する方法です。
デバッグで必要な情報なので、実行ログファイルへの書き出しなどで利用することが多いです。ログファイル書き出しも合わせて解説します。
実行中のクラス・メソッド・行番号を取得する方法
実行中のクラス・メソッド・行番号は、デバッグやユーザーからの問い合わせの際に必須となる情報です。
また、それらをログファイルに書き出しておくと、調査の時間が短縮されます。
サンプル様に簡単な画面を用意しました。
ボタンが4つあります。各ボタンは、
- クラス名取得ボタン:クラス名を表示
- メソッド名取得ボタン:メソッド名を表示
- 行番号取得ボタン:行番号を表示
- ログ書き出しボタン:クラス名・メソッド名・行番号をログファイルに書き出し
という仕様です。それぞれサンプルコードを紹介します。
実行中のクラス名を取得
実行中のクラス名を取得する場合、ObjectクラスのGetTypeメソッド使ってTypeオブジェクトを取得し、Nameプロパティを参照するとクラス名が取得できます。
namespace CS_Get_APP_Info { public partial class Form_CS_Get_APP_Info : Form { public Form_CS_Get_APP_Info() { InitializeComponent(); } private void cmdGetClass_Click(object sender, EventArgs e) { //クラス名取得 string strMsg = GetType().Name + " を実行中。"; //メッセージボックスでクラス名を表示 MessageBox.Show(strMsg , "情報" , MessageBoxButtons.OK , MessageBoxIcon.Information); } } }
実際に実行してみましょう。
クラス名がメッセージボックスに表示されました。
実行中のメソッド名を取得
実行中のメソッド名を取得する場合は、MethodBaseクラスのGetCurrentMethodメソッドを使用すると、メソッド名が取得できます。
namespace CS_Get_APP_Info { public partial class Form_CS_Get_APP_Info : Form { public Form_CS_Get_APP_Info() { InitializeComponent(); } private void cmdGetMethod_Click(object sender, EventArgs e) { //メソッド名取得 string strMsg = System.Reflection.MethodBase.GetCurrentMethod().Name + " を実行中。"; //メッセージボックスでクラス名を表示 MessageBox.Show(strMsg , "情報" , MessageBoxButtons.OK , MessageBoxIcon.Information); } } }
実際に実行してみます。
メソッド名がメッセージボックスに表示されました。
行番号を取得
今まさに実行しているプログラムソースの行番号を取得する場合、CallerLineNumberAttribute クラスを使用します。
namespace CS_Get_APP_Info { public partial class Form_CS_Get_APP_Info : Form { public Form_CS_Get_APP_Info() { InitializeComponent(); } private void cmdGetNumber_Click(object sender, EventArgs e) { //ファイルの行番号取得 string strMsg = GetLineNumber().ToString() + " 行目。"; //この行(サンプルでは50行目)が表示される //メッセージボックスで行番号を表示 MessageBox.Show(strMsg , "情報" , MessageBoxButtons.OK , MessageBoxIcon.Information); } //行番号取得用メソッド private int GetLineNumber([CallerLineNumber] int intLineNumber = 0) { return intLineNumber; } } }
上記ソースコードでは、GetLineNumberメソッドを作成していますので、同じようにコピペして作成してみて下さい。
実行してみましょう。
行番号が取得できています。
実行中のクラス名・メソッド名・行番号をログファイル出力する
さて、実行中のクラス名・メソッド名・行番号の取得方法が分かったので、実際にログファイルに書き出してみましょう。
//行番号取得のため追加 using System.Runtime.CompilerServices; namespace CS_Get_APP_Info { public partial class Form_CS_Get_APP_Info : Form { public Form_CS_Get_APP_Info() { InitializeComponent(); } //ログに書き出すサンプル private void cmdOutPutLog_Click(object sender, EventArgs e) { //クラス名取得 string strMsgClass = GetType().Name; //メソッド名取得 string strMsgMethod = System.Reflection.MethodBase.GetCurrentMethod().Name; //ファイルの行番号取得 string strMsgNum = GetLineNumber().ToString(); //ログファイル書き出し用文字列を作成 string strLog = "クラス名:" + strMsgClass + " " + "メソッド名:" + strMsgMethod + " " + "行番号" + strMsgNum + Environment.NewLine; //見た目のため改行コード挿入 //D:\CS\Log_OutPut\EventLog.log System.IO.StreamWriter objSW = new System.IO.StreamWriter( @"D:\CS\Log_OutPut\EventLog.log" , true , System.Text.Encoding.GetEncoding("shift_jis")); //書き込み DateTime objDT = DateTime.Now; objSW.Write(objDT.ToString("yyyy/MM/dd HH:mm:ss:fff") + " " + strLog); objSW.Close(); } //行番号取得用メソッド private int GetLineNumber([CallerLineNumber] int intLineNumber = 0) { return intLineNumber; } } }
実際に実行してログファイルを確認してみます。何度か出力してみました。
ログファイル書き出しまで出来れば、基本的な実行ログは取得できます。
参考サイト
Type.GetType メソッド (System) | Microsoft Docs
MethodBase.GetCurrentMethod メソッド (System.Reflection) | Microsoft Docs
CallerLineNumberAttribute クラス (System.Runtime.CompilerServices) | Microsoft Docs
.