如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方方法

本文关键字:方方法 调用 跟踪 方法 实现 CallerMemberName 何使用 属性 ILoggerFacade | 更新日期: 2023-09-27 18:02:43

我正在尝试将日志功能实现到我的新WPF 4.5 CompositeWPF (Prism)项目中。这需要我在代码中实现ILoggerFacade。接口只实现一种方法: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中的一个新特性,所以我希望能有一个比现在更好的解决方案。

如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方方法

不幸的是,您能够使此工作的唯一方法是修改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");