如何使用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");