2016-11-23 15 views
0

相當堅持這一個......我有這個問題,我們在一個Unity項目中使用log4Net來構建Windows商店應用程序。 log4Net需要聲明記錄器的類類型或名稱(作爲字符串)。由於Windows商店.NET修改它並沒有像GetCurrentMethod()常用的方法......我檢查周圍,到目前爲止,這是毫無希望:Windows商店應用程序.NET GetCurrentMethod()。DeclaringType替代

通常的方法是這樣的

public sealed class SomeClassController : ApiController 
{ 
    private static readonly ILog Log = 
     LoggerManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
... 

How to get method name win 8 app - 解決方案這裏提供的不起作用,因爲[CallerMememberName]屬性返回調用者(不是聲明者)。 func(表達式表達式)方法不起作用,因爲它只適用於在方法內部使用,但不能用作類字段(這在log4Net中就是這種情況)。

另一種可能性是使用StackFrame,但幸運的是Windows存儲不支持它,唯一的方式來到StackTrace是通過一個異常,這是不是一個選項,因爲1.是真的很慢2.所有異常投擲必須在Unity生產中刪除。

像GetType()這樣簡單的解決方案不起作用,因爲如果有繼承類,它們會被重寫。更多這裏 - http://rundevrun.blogspot.lt/2012/11/gettype-vs-methodbasegetcurrentmethodde.html

我用盡了選擇,有沒有辦法得到DeclaringType,當在類字段中使用?

+2

你不能只使用'typeof'的任何理由?是的,這不是簡單的粘貼,但它是一個更簡單的方法... –

+0

有一些複雜的情況,它不是很清楚哪個類的類型將是一個類聲明它並使用通常不提及的方法必須指定它。 – MattJ

+2

我會說,在那些複雜的情況下,使用'typeof'會更清晰 - 這就是非常非常明顯的結果。無論如何,你說你已經沒有選擇:我會說'typeof'絕對是一種選擇,它非常簡單。 –

回答

1

只需使用typeof代替 - 這是更簡單,並且不需要任何框架的支持:

public sealed class SomeClassController : ApiController 
{ 
    private static readonly ILog Log = 
     LoggerManager.GetLogger(typeof(SomeClassController)); 
    ... 
} 

唯一的缺點是,如果你複製和粘貼其他地方,你最終會與記錄錯誤的類。你可以減輕由:

  • 寫羅斯林代碼分析器(或類似),以發現問題
  • 小心在代碼審查
  • 有「查找LoggerManager.GetLogger和審查所有通話預發行工序他們「
相關問題