다음은 내가 원하는 작업의 예입니다.
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 번 줄의 Boo (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
for CallerMemberName
및 CallerFilePath
및 int
for CallerLineNumber
여야하며 기본값이 있어야합니다. 메서드 매개 변수에 이러한 특성을 지정하면 컴파일 타임에 적절한 값을 호출 코드에 삽입하도록 컴파일러에 지시합니다. 즉, 난독 화를 통해 작동합니다. 자세한 내용은 발신자 정보 를 참조하십시오.
StackFrame
예제를 컴파일하는 경우 컴파일 시간과 런타임 에 사용 하십시오--debug
StackFrame
.NET Core에서는 사용할 수 없습니다. Marc Gravell의 대답을 사용하십시오.
= string.Empty
오류가 발생 합니다 !
""
대신 큰 따옴표 ( ) 를 사용하도록 시험을 변경했습니다 string.Empty
.
나는 하나의 라이너를 선호합니다.
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의 탁월한 답변을 기반으로합니다.