3

我正在尝试在我的新 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 = "")
    {
         ...

所以我的问题是,如何覆盖Log第三方(Prism)接口强制执行的方法以包含 1 个额外的可选参数?或者如何使用此属性传递调用方方法名称以便记录它?

我见过其他类似的问题,但 [CallerMemberName] 属性是 .NET 4.5 中的一个新功能,所以我希望有一个比所提供的解决方案更好的解决方案。

4

2 回答 2

5

不幸的是,您能够完成这项工作的唯一方法是修改 Prism 源并重建二进制文件。例如,将 callerMethod 参数添加到 ILoggerFacade 的 Log 方法中。

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

如果有任何类已经实现了 ILoggerFacade,你也需要修改它们。

于 2013-03-06T21:41:45.593 回答
2

您可以使用一些额外的方法扩展 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");
于 2015-06-19T19:45:30.523 回答