2014-01-22 5 views
1

Есть ли способ включить номера строк и имя файла в функции C# Console.WriteLine?Как включить номер строки и имя файла Console.WriteLine output?

Например, в строке 115 файла «myClass.cs» У меня есть заявление

Console.WriteLine("Hello world"); 

Я хотел бы выход быть:

[myClass.cs][115]: Hello world 
+1

Действительно Вы хотите о utput как это? – Satpal

+3

Посмотрите здесь: http://stackoverflow.com/questions/6369184/print-the-source-filename-and-linenumber-in-c-sharp – christiandev

+0

Вы хотите ИЗМЕНИТЬ поведение Console.WriteLine для этого или вы просто хотите получить номера строк? Для номеров строк проверьте: http://stackoverflow.com/questions/4900744/is-there-a-way-to-get-the-current-line-number-when-executing-code-c-sharp – cvbarros

ответ

12

Если вы используете C# 5, вы можете использовать caller information attributes, чтобы сделать это. Например:

using System; 
using System.IO; 
using System.Runtime.CompilerServices; 

public class Test 
{ 
    static void Log(string message, 
        [CallerFilePath] string file = null, 
        [CallerLineNumber] int line = 0) 
    { 
     Console.WriteLine("{0} ({1}): {2}", Path.GetFileName(file), line, message); 
    } 

    static void Main() 
    { 
     Log("Hello, world"); 
     Log("This is the next line"); 
    } 
} 

Выход:

Test.cs (16): Hello, world 
Test.cs (17): This is the next line 

Перед C# 5, вы застряли с проверкой выполнения стека времени, который является менее надежным благодаря встраиванию, и опирается на информацию, присутствующей в время исполнения. (Это, возможно, не в сборке высвобождения, например, в то время как выше будет работать.)

+2

+1 Это * очень * аккуратный трюк – rae1

+2

Важно отметить, что ** компилятор ** делает тяжелый подъем с этими атрибутами. Если вы используете компилятор C# 5 *, вы можете обладать красотой этих атрибутов даже при таргетинге на предыдущие версии фреймворка (или версии, которые их не имеют). Например, вы можете создать проект MVVM для Portable Framework и хотите использовать 'CallerMemberNameAttribute', но он не существует в этой версии' System.Runtime.CompilerServices'. Если вы вручную создаете атрибут и используете его, компилятор будет по-прежнему выполнять его и выполнять. – Erik

1

Вы можете изучить StackTrace с помощью this constructor, получите StackFrame, а затем позвоните GetFileName() и GetFileLineNumber() на StackFrame. Обратите внимание, что для этого приложения должны быть доступны файлы .pdb.

http://social.msdn.microsoft.com/Forums/en-US/a58dc2a0-0612-407b-8cbe-10f1784ba85a/how-to-retreive-the-line-number-and-file-name-of-c-source-code?forum=csharplanguage

модифицированный код ссылки:

using System.Diagnostics; 

var StackTrace = new System.Diagnostics.StackTrace(true); 
var StackFrame = StackTrace.GetFrame(0); 
string FileName = StackFrame.GetFileName(); 
string LineNumber = StackFrame.GetFileLineNumber().ToString(); 
0

Я хотел бы создать вспомогательный метод для этого и использовать решение, которое Марк Gravell писал в этом посте: How do I get the current line number?

Что-то вроде ...

public static class WriteLineHelper 
{ 
    public static void WriteLine(string message, 
     [CallerLineNumber] int lineNumber = 0, 
     [CallerMemberName] string caller = null) 
    { 
     Console.WriteLine(string.Format("[{0}][{1}] : {2}, caller, lineNumber, message); 
    } 
} 

Тогда в myClass.cs, просто заменить вызов Console.WriteLine с:

WriteLineHelper.WriteLine("Hello world."); 
+2

... или в основном, что сказал Джон Скит. – ScottMB

Смежные вопросы