Как получить текущий номер строки?

Вот пример того, что я хочу сделать:

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

Текущий номер строки будет номером строки в исходном коде этого fragmentа кода.

Как я могу это сделать?

В .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); } 
  • Как создать WPat Datagrid с неизвестным количеством столбцов
  • Связывание свойства enum с ComboBox в WPF
  • Изменение формата строки WPF DatePicker
  • Создание WPF BitmapImage из MemoryStream png, gif
  • Ошибка ReSharper WPF: «Не удается разрешить символ« MyVariable »из-за неизвестного DataContext»
  • WPF: отобразить значение bool как «Да» / «Нет»
  • Установите фокус на текстовое поле в WPF
  • Как вы можете клонировать объект WPF?
  • Как я могу использовать RelayCommand в wpf?
  • Разница между SelectedItem, SelectedValue и SelectedValuePath
  • Объединить расширитель и сетку (изменяемый размер расширителя)
  • Давайте будем гением компьютера.