2014-01-22 53 views
1

有沒有辦法在C#的Console.WriteLine函數中包含行號和文件名?如何包含行號和文件名Console.WriteLine輸出?

例如,在文件「myClass.cs」的行115我有聲明

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項目,並希望使用'CallerMemberNameAttribute',但它不存在於該版本的'System.Runtime.CompilerServices'中。如果您手動創建該屬性並使用該屬性,編譯器將仍然遵守並實施它。 – Erik

1

可以使用檢查StackTracethis constructor,從中獲得StackFrame,然後在StackFrame上調用GetFileName()GetFileLineNumber()。請注意,這將需要.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

我想創建一個helper方法,這和利用是馬克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

......或者基本上,Jon Skeet說的。 – ScottMB

相關問題