スポンサーリンク

【C#】実行中のクラス・メソッド・行番号を取得する方法

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

スポンサーリンク

鉄道記事も書いてます!

ちょっとリフレッシュして鉄道記事も読んでみませんか?

鉄道記事バックナンバーはこちら↓

鉄道コム投稿記事一覧ページ