148

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

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

上記のコードCurrentLineNumberで、 は、このコードのソース コード内の行番号である必要があります。

どうやってやるの?

4

7 に答える 7

214

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

using System.Runtime.CompilerServices;

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]元のコード ファイルのパスを示すものもあります。

于 2013-01-02T13:17:18.017 に答える
88

たとえば、次のように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
}

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

于 2012-09-23T22:26:40.823 に答える
23

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

int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
于 2013-05-29T15:20:31.343 に答える
4

.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()(ファイル名.cs:104)

ここを見て!

Console.WriteLine フォーマットを好きなように変更してください!

于 2014-06-25T17:47:51.517 に答える
4

.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 による優れた回答に基づいています。

于 2017-05-23T15:17:04.573 に答える
3

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());
}
于 2012-09-23T22:28:39.827 に答える