Oto przykład tego, co chcę zrobić:
MessageBox.Show("Error line number " + CurrentLineNumber);
W powyższym kodzie CurrentLineNumber
, powinno być numerem linii w kodzie źródłowym tego fragmentu kodu.
Jak mogę to zrobić?
c#
wpf
c#-4.0
line-numbers
MonsterMMORPG
źródło
źródło
Odpowiedzi:
W .NET 4.5 / C # 5 możesz sprawić, by kompilator wykonał tę pracę za Ciebie, pisząc metodę narzędzia, która używa nowych atrybutów obiektu wywołującego:
Spowoduje to wyświetlenie na przykład:
Jest tam również,
[CallerFilePath]
który podaje ścieżkę do oryginalnego pliku kodu.źródło
Użyj metody StackFrame.GetFileLineNumber , na przykład:
Zobacz wpis na blogu Scotta Hanselmana na aby uzyskać więcej informacji.
[Edycja: dodano następujące]
W przypadku użytkowników korzystających z .Net 4.5 lub nowszego należy rozważyć atrybuty CallerFilePath , CallerMethodName i CallerLineNumber w przestrzeni nazw System.Runtime.CompilerServices. Na przykład:
Argumentami muszą być argumenty
string
forCallerMemberName
iCallerFilePath
orazint
forCallerLineNumber
i muszą mieć wartość domyślną. Określenie tych atrybutów w parametrach metody instruuje kompilator, aby wstawił odpowiednią wartość do kodu wywołującego w czasie kompilacji, co oznacza, że działa on przez zaciemnianie. Aby uzyskać więcej informacji, zobacz Informacje o dzwoniącym .źródło
StackFrame
przykład na Mono , pamiętaj, aby używać go--debug
w czasie kompilacji iw czasie wykonywaniaStackFrame
nie jest dostępny w .NET Core. Skorzystaj z odpowiedzi Marca Gravella.= string.Empty
generuje błąd „Domyślna wartość parametru dla„ CallFilePath ”musi być stałą czasu kompilacji” !""
) zamiaststring.Empty
.Wolę jeden wkład, więc:
źródło
Dla tych, którzy potrzebują rozwiązania metody .NET 4.0+:
Jak zadzwonić:
Wynik:
Zmień format Console.WriteLine, jak chcesz!
źródło
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
możesz kliknąć linię w oknie wyjściowym i przejść do tej linii w źródle.Jeśli jest w bloku try catch, użyj tego.
źródło
W .NET 4.5 możesz uzyskać numer linii, tworząc funkcję:
Wtedy za każdym razem, gdy zadzwonisz
LineNumber()
, będziesz mieć bieżącą linię. Ma to tę przewagę nad jakimkolwiek rozwiązaniem używającym StackTrace, że powinno działać zarówno w debugowaniu, jak i wydaniu.Biorąc więc pierwotną prośbę o to, co jest wymagane, stałoby się:
Opiera się to na doskonałej odpowiedzi Marca Gravella.
źródło