2012-12-16 85 views
3

我們有一個「記錄器」類,它有log方法獲取日誌消息,並向日志中寫入消息和調用方法,首先我們做了以下也發送到日誌方法新參數Method.Base.GetCurrentMethod()。 我找到了另一種方式,使用Relection.MethodBase:如何提高代碼獲取調用方法在C#中

public void Log(string message) 
{ 
    stackTrace = new StackTrace(); 
    string methodName = stackTrace.GetFrame(1).GetMethod().Name; 
    .... 
} 

但是我有一個問題,每一個呼叫日誌的方法,我不得不從StackTrace創建新實例,當我試圖創建實例在構造函數中,我得到的方法名稱是InvokeMethod

我們在我們的項目中使用MEF。 任何想法如何改善代碼?

回答

3

我建議使用完整的堆棧跟蹤「信息日誌」(無異常細節日誌),使用

StackTrace stackTrace = new StackTrace(true); 
string stackTraceString = stackTrace.ToString(); 

會給你源信息的完整堆棧跟蹤。

但是,當您有具有異常實例的日誌(例如記錄在catch語句中)時,可以使用堆棧跟蹤和異常本身的內部異常信息,而不僅僅是調用方法。

StackTrace stackTrace = new StackTrace(ex, true); 
string stackTraceString = stackTrace.ToString(); 

雖然(ex)是你需要堆棧跟蹤的例外。

*編輯*

或者您可以使用:

Environment.StackTrace,它是一個字符串屬性!但包含get_StackTrace的調用,您可以編寫一個簡單的代碼來刪除此部分,但我認爲可以根據需要製作堆棧跟蹤對象,這並不是什麼大問題。

+1

對不起!你沒有達到我自己的目標,我需要一種方法來減少從StackTrace創建實例 –

+1

請參閱我的編輯@RamzyAbourafeh! –

+0

我不能在環境中罰款StackTrace成員,在Silverlight中使用它會有問題嗎? –

1

在實施您的解決方案之前,您應該瞭解Method Inlining。

看看Scott Hanselman的this article,他試圖實現幾乎相同的功能。一些更多信息here

+1

我可以做到以下幾點: 日誌(消息,MethodBase。GetCurrentMethod()); 但我需要將編碼保存到開發人員 –

6

如果您使用的是C#(5)的最新版本,它通過調用站點屬性構建到語言中。你會使用這樣的:

public void Log(string message, [CallerMemberName] string methodName = null) 
{ 
} 

你調用該方法,而無需提供第二個參數,和C#編譯器會自動填充它爲你。您可以隨時使用以下「呼叫站點」屬性:CallerMemberName,CallerLineNumberCallerFilePath

+0

酷。不知道這件事。 +1。 – Ikaso

+0

霍烏古格回答:) –

0

您可以爲此使用PostSharp。請參閱this頁面以獲取如何改進代碼的示例。