Как получить текущий номер строки?
вот пример что я хочу сделать:
MessageBox.Show("Error line number "+CurrentLineNumber);
номер текущей строки будет номером строки в исходном коде этого фрагмента кода.
Как я могу это сделать?
7 ответов
в .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 + ")");
}
это будет отображаться, например:
Boo на линии 39 (SomeMethodSomewhere)
там же [CallerFilePath]
, который подскажет вам путь к исходному файлу код.
использовать кадра стека.GetFileLineNumber способ, например:
private static void ReportError(string message)
{
StackFrame callStack = new StackFrame(1, true);
MessageBox.Show("Error: " + message + ", File: " + callStack.GetFileName()
+ ", Line: " + callStack.GetFileLineNumber());
}
посмотреть запись в блоге Скотта Хансельмана для получения дополнительной информации.
[Edit: добавлено следующее]
для тех, кто использует .Net 4.5 или более поздней версии, рассмотрим CallerFilePath, CallerMethodName и CallerLineNumber атрибуты в системе.Во время выполнения.Пространство имен 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)
посмотреть здесь!
изменить консоль.WriteLine формат, как вам нравится!
если его в блоке 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());
это строится на отличном ответе Марка Гравелла.
это работает для меня:
try
{
//your code;
}
catch(Exception ex)
{
MessageBox.Show(ex.StackTrace + " ---This is your line number, bro' :)", ex.Message);
}