如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方法?
我正在尝试将记录function实现到我的新WPF 4.5 CompositeWPF(Prism)项目中。 这要求我在我的代码中实现ILoggerFacade。 接口只实现1种方法: Log(string message, Category category, Priority priority)
。
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中的一个新function,所以我希望找到比提供的更好的解决方案。
不幸的是,你能够做到这一点的唯一方法是修改Prism源并重建二进制文件。 例如,将callerMethod参数添加到ILoggerFacade的Log方法中。
public interface ILoggerFacade { void Log(string message, Category category, Priority priority, [CallerMemberName] string callerMethod = ""); }
如果有任何已经实现ILoggerFacade的类,您还需要修改它们。
您可以使用一些额外的方法扩展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); } }
然后你只使用扩展方法而不是Log():
logger.LogError("message");