Как получить текущий номер строки?
Вот пример того, что я хочу сделать:
MessageBox.Show("Error line number "+CurrentLineNumber);
Текущий номер строки будет номером строки в исходном коде этого fragmentа кода.
Как я могу это сделать?
- Как я могу использовать автоматическую прокрутку ListBox при добавлении нового элемента?
- Разница между {Binding PropertyName} и {Binding Path = PropertyName}
- WPF: Как связать команду с ListBoxItem с помощью MVVM?
- TabControl с кнопкой Добавить новую вкладку (+)
- Как я могу создать границу и строку заголовка windows в WPF?
- Как связать перечисление с элементом управления combobox в WPF?
- WPF MVVM: Конвенция о конфигурации для ResourceDictionary?
- Как отключить эффекты MouseOver для кнопки в WPF?
- Кадрирование изображений WPF
- Отображение видимости столбцов Bind datagrid MVVM
- Как отключить Aero Snap в приложении?
- WPF Canvas, как динамически добавлять детей с кодом MVVM
- Как вы полностью удаляете границу кнопки в wpf?
В .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()); }
См . Запись в блоге Скотта Хансельмана для получения дополнительной информации.
[Изменить: добавлено следующее]
Для тех, кто использует .Net 4.5 или новее, рассмотрите атрибуты CallerFilePath , CallerMethodName и CallerLineNumber в пространстве имен System.Runtime.CompilerServices. Например:
public void TraceMessage(string message, [CallerMemberName] string callingMethod = string.Empty, [CallerFilePath] string callingFilePath = string.Empty, [CallerLineNumber] int callingFileLineNumber = 0) { // Write out message }
Аргументы должны быть string
для CallerMemberName
и CallerFilePath
и int
для CallerLineNumber
и должны иметь значение по умолчанию. Указание этих атрибутов на параметрах метода дает указание компилятору вставить соответствующее значение в вызывающий код во время компиляции, то есть он работает через обфускацию. См. Информацию о вызывающем абоненте для получения дополнительной информации.
Я предпочитаю один вкладыш так:
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, как вам нравится!
Если это в блоке catch try, используйте это.
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());
Это строится на превосходном ответе Марка Гравелла.
Это работает для меня:
try { //your code; } catch(Exception ex) { MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message); }