これが私がしたいことの例です:
MessageBox.Show("Error line number " + CurrentLineNumber);
上のCurrentLineNumber
コードでは、このコードのソースコードの行番号を指定する必要があります。
どうやってやるの?
これが私がしたいことの例です:
MessageBox.Show("Error line number " + CurrentLineNumber);
上のCurrentLineNumber
コードでは、このコードのソースコードの行番号を指定する必要があります。
どうやってやるの?
回答:
.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]
元のコードファイルのパスを通知するものもあります。
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名前空間のCallerFilePath、CallerMethodName、およびCallerLineNumber属性を検討してください。例えば:
public void TraceMessage(string message,
[CallerMemberName] string callingMethod = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
引数がなければなりませんstring
ためCallerMemberName
とCallerFilePath
してint
のためにCallerLineNumber
、デフォルト値を持っている必要があります。メソッドパラメータにこれらの属性を指定すると、コンパイル時に呼び出しコードに適切な値を挿入するようにコンパイラに指示します。つまり、難読化によって機能します。詳細については、発信者情報を参照してください。
StackFrame
に例のモノを、確認することで使用--debug
コンパイル時と実行時に
StackFrame
.NET Coreでは使用できません。マークグラベルの答えを使用してください。
= string.Empty
エラーがスローされます。
""
代わりに二重引用符()を使用するように試験を変更しましたstring.Empty
。
私は1つのライナーを好むので:
int lineNumber = (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber();
.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形式を好きなように変更してください!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
、出力ウィンドウの行をクリックして、ソースのその行に移動できます。
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());
}
.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による優れた回答に基づいています。