2013-03-06 31 views
3

我正在嘗試在我的新WPF 4.5 CompositeWPF(Prism)項目中實現日誌記錄功能。 這需要我在我的代碼中實現ILoggerFacade。該接口只實現1種方法:Log(string message, Category category, Priority priority)如何使用CallerMemberName屬性更改ILoggerFacade實現以跟蹤調用方法?

ILoggerFacade接口:

public interface ILoggerFacade 
{ 
    void Log(string message, Category category, Priority priority); 
} 

我的實現:

public class Log4NetLogger : ILoggerFacade 
{ 
    private static readonly ILog m_Logger = LogManager.GetLogger(typeof(ILoggerFacade)); 

    public void Log(string message, Category category, Priority priority) 
    { 
     switch (category) 
     { 
      case Category.Debug: 
       m_Logger.Debug(message); 
       break; 
      case Category.Warn: 
       m_Logger.Warn(message); 
       break; 
      case Category.Exception: 
       m_Logger.Error(message); 
       break; 
      case Category.Info: 
       m_Logger.Info(message); 
       break; 
     } 
    } 
} 

我相信,在新推出的[CallerMemberName]屬性我應該能夠得到,如果只有我傳遞給記錄來電者的方法名知道如何做這樣的事情:

public class Log4NetLogger : ILoggerFacade 
{ 
    public void Log(string message, Category category, Priority priority, [CallerMemberName] string callerMethod = "") 
    { 
     ... 

所以我的問題,我如何覆蓋由第三方(Prism)接口強制執行的Log方法包含1個額外的可選參數?或者,如何使用此屬性傳遞調用方法名稱,以便我可以記錄它?

我已經看到了其他類似的問題,但[CallerMemberName]屬性是.NET 4.5中的一個新特性,所以我希望得到比所提供的更好的解決方案。

回答

4

不幸的是,你能做這項工作的唯一方法是修改棱鏡源和重建二進制文件。例如將callerMethod參數添加到ILoggerFacade的Log方法中。

public interface ILoggerFacade 
{ 
    void Log(string message, Category category, 
      Priority priority, [CallerMemberName] string callerMethod = ""); 
} 

如果有任何類已經實現了ILoggerFacade,您還需要修改它們。

+0

感謝。這是我最後的選擇。如果有辦法,我寧願不去。 – LukeP 2013-03-06 21:51:37

+2

我沒有想到接口方法參數上的'[CallerMemberName]'屬性可以工作,但它確實!真棒!在我的情況下,我有日誌接口的源代碼,所以改變接口方法來添加屬性是沒問題的。這是一個很好的問題和答案,真的讓我擺脫了泡菜,謝謝你們。 – 2015-10-21 09:25:36

1

可以擴展ILoggerFacade接口與一些額外的方法,就像這樣:

public static class LoggerExtensions 
{ 
    public static void LogError(this ILoggerFacade logger, string message, [CallerMemberName] string caller = "") 
    { 
     logger.Log(message + ' ' + caller, Category.Exception, Priority.High); 
    } 
} 

然後你只需要使用您的擴展方法,而不是日誌():

logger.LogError("message");