Ось приклад того, що я хочу зробити:
MessageBox.Show("Error line number " + CurrentLineNumber);
У коді вище CurrentLineNumber
, повинен бути номер рядка у вихідному коді цього фрагмента коду.
Як я можу це зробити?
Ось приклад того, що я хочу зробити:
MessageBox.Show("Error line number " + CurrentLineNumber);
У коді вище CurrentLineNumber
, повинен бути номер рядка у вихідному коді цього фрагмента коду.
Як я можу це зробити?
Відповіді:
У .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 = "",
[CallerFilePath] string callingFilePath = "",
[CallerLineNumber] int callingFileLineNumber = 0)
{
// Write out message
}
Аргументи повинні бути string
для CallerMemberName
і CallerFilePath
і int
для CallerLineNumber
і повинні мати значення за замовчуванням. Визначаючи ці атрибути в параметрах методу, вказує компілятору вставити відповідне значення в код виклику під час компіляції, тобто це працює через обфускування. Див. Інформацію про абонента для отримання додаткової інформації.
StackFrame
приклад на Mono , не забудьте скористатися--debug
під час компіляції та під час виконання
StackFrame
недоступний у .NET Core. Використовуйте відповідь Марка Гравелла.
= string.Empty
кидає помилку "Значення параметра за замовчуванням для 'callFilePath' повинно бути констатою часу компіляції" !
""
) замість string.Empty
.
Я віддаю перевагу одному вкладишам так:
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!");
}
Вихід:
Недійсний тест () (FILENAME.cs: 104)
Послухайте!
Змініть формат Console.WriteLine, як вам подобається!
System.Diagnostics.Debug.WriteLine(String.Format("{0}({1}): {2}: {3}", fileName, lineNumber, methodName, message));
тоді ви можете натиснути рядок у вікні виводу та перейти до цього рядка у джерелі.
Якщо його в блоці спробу лову, скористайтеся цим.
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());
Це спирається на чудову відповідь Марка Гравелла.