web-dev-qa-db-ja.com

現在の行番号を取得するにはどうすればよいですか?

これが私がやりたいことの例です:

 MessageBox.Show("Error line number "+CurrentLineNumber);

現在の行番号は、このコードのソースコードの行番号になります。

どうやってやるの?

106
MonsterMMORPG

.NET 4.5/C#5では、新しい呼び出し元の属性を使用するユーティリティメソッドを記述することで、コンパイラにこの作業を実行させることができます。

static void SomeMethodSomewhere()
{
    ShowMessage("Boo");
}
...
static void ShowMessage(string message,
    [CallerLineNumber] int lineNumber = 0,
    [CallerMemberName] string caller = null)
{
     MessageBox.Show(message + " at line " + lineNumber + " (" + caller + ")");
}

これにより、たとえば次のように表示されます。

39行目でブー(SomeMethodSomewhere)

元のコードファイルのパスを示す[CallerFilePath]もあります。

156
Marc Gravell

StackFrame.GetFileLineNumber メソッドを使用します。例:

private static void ReportError(string message)
{
     StackFrame callStack = new StackFrame(1, true);
     MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName() 
          + ", Line: " + callStack.GetFileLineNumber());
}

詳細については、 Scott Hanselmanのブログエントリ を参照してください。

[編集:以下を追加]

.Net 4.5以降を使用している場合は、System.Runtime.CompilerServices名前空間の CallerFilePathCallerMethodName および CallerLineNumber 属性を考慮してください。例えば:

public void TraceMessage(string message,
        [CallerMemberName] string callingMethod = "",
        [CallerFilePath] string callingFilePath = "",
        [CallerLineNumber] int callingFileLineNumber = 0)
{
    // Write out message
}

引数は、stringおよびCallerMemberNameの場合はCallerFilePathであり、intの場合はCallerLineNumberであり、デフォルト値が必要です。メソッドパラメーターでこれらの属性を指定すると、コンパイル時に呼び出し元のコードに適切な値を挿入するようにコンパイラーに指示します。つまり、難読化によって機能します。詳細については、「 発信者情報 」を参照してください。

66
akton

私は1つのライナーを好むので:

int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
17
iambriansreed

.NET 4.0+メソッドソリューションが必要な場合:

using System;
using System.IO;
using System.Diagnostics;

public static void Log(string message) {
   StackFrame stackFrame = new System.Diagnostics.StackTrace(1).GetFrame(1);
   string fileName = stackFrame.GetFileName();
   string methodName = stackFrame.GetMethod().ToString();
   int lineNumber = stackFrame.GetFileLineNumber();

   Console.WriteLine("{0}({1}:{2})\n{3}", methodName, Path.GetFileName(fileName), lineNumber, message);
}

電話方法:

void Test() {
   Log("Look here!");
}

出力:

Void Test()(FILENAME.cs:104)

ここを見て!

Console.WriteLine形式を好きなように変更してください!

4
Jared Burrows

Try catchブロックにある場合、これを使用します。

try
{
    //Do something
}
catch (Exception ex)
{
    System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true);
    Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber());
}
3
Nate-Wilkins

.NET 4.5では、関数を作成して行番号を取得できます。

static int LineNumber([System.Runtime.CompilerServices.CallerLineNumber] int lineNumber = 0)
{
    return lineNumber; 
}

その後、LineNumber()を呼び出すたびに、現在の行が表示されます。これには、デバッグとリリースの両方で動作するStackTraceを使用するソリューションに勝る利点があります。

したがって、必要なものの元の要求を取得すると、次のようになります。

MessageBox.Show("Error enter code here line number " + LineNumber());

これは、Marc Gravellによる優れた答えに基づいています。

1
Brian Cryer