Вот пример того, что я хочу сделать:
MessageBox.Show("Error line number " + CurrentLineNumber);
В коде выше CurrentLineNumber
должен быть номер строки в исходном коде этого фрагмента кода.
Как я могу это сделать?
c#
wpf
c#-4.0
line-numbers
MonsterMMORPG
источник
источник
Ответы:
В .NET 4.5 / C # 5 вы можете заставить компилятор выполнять эту работу за вас, написав служебный метод, который использует новые атрибуты вызывающего объекта:
Это отобразит, например:
Там также
[CallerFilePath]
указывается путь к исходному файлу кода.источник
Используйте метод StackFrame.GetFileLineNumber , например:
См . Запись в блоге Скотта Хансельмана для получения дополнительной информации.
[Изменить: добавлено следующее]
Для тех, кто использует .Net 4.5 или новее, рассмотрите атрибуты CallerFilePath , CallerMethodName и CallerLineNumber в пространстве имен System.Runtime.CompilerServices. Например:
Аргументы должны быть
string
дляCallerMemberName
иCallerFilePath
иint
дляCallerLineNumber
и должны иметь значение по умолчанию. Указание этих атрибутов в параметрах метода инструктирует компилятор вставить соответствующее значение в вызывающий код во время компиляции, что означает, что он работает через обфускацию. См. Информацию о вызывающем абоненте для получения дополнительной информации.источник
StackFrame
пример на Mono , обязательно используйте--debug
во время компиляции и во время выполненияStackFrame
недоступен в .NET Core. Воспользуйтесь ответом Марка Гравелла.= string.Empty
вызывает ошибку «Значение параметра по умолчанию для 'CallingFilePath' должно быть константой времени компиляции» !""
) вместоstring.Empty
.Я предпочитаю одинарные вкладыши:
источник
Для тех, кому нужно решение метода .NET 4.0+:
Как позвонить:
Вывод:
Измените формат Console.WriteLine на свой вкус!
источник
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
то вы можете щелкнуть строку в окне вывода и перейти к этой строке в источнике.Если он находится в блоке try catch, используйте это.
источник
В .NET 4.5 вы можете получить номер строки, создав функцию:
Тогда каждый раз, когда вы звоните, у
LineNumber()
вас будет текущая линия. Это имеет преимущество перед любым решением, использующим StackTrace, в том, что оно должно работать как при отладке, так и при выпуске.Таким образом, если исходный запрос о том, что требуется, будет следующим:
Это основано на прекрасном ответе Марка Гравелла.
источник