0

我正在试验这些新的 .NET 4.5 属性,这些属性有望使日志记录更容易一些。运行时应负责提供值,例如 [CallerMemberNameAttribute] 映射到应包含调用者方法名称的字符串参数。

但是,我发现 MEF 似乎在干扰。

考虑以下接口:

[InheritedExport]
public interface ILogger
{
    void Write(string message, string methodName = "", string srcFilePath = "", int srcLineNumber = 0, params object[] args);
}

以及以下实现:

public sealed class Logger : ILogger
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public void Write(string message, [CallerMemberName] string methodName = "", [CallerFilePath] string srcFilePath = "", [CallerLineNumber] int srcLineNumber = 0, params object[] args)
    {
        // do some logging
    }
}

如果将此 ILogger 导入应用程序的组合容器并使用 ILogger.Write 方法,则运行时应填写标有 [CallerX] 属性的可选参数。

但是,这不会发生,所有值都设置为其默认值。

有任何想法吗?或者这是一个错误?

4

1 回答 1

2

我最终发现了问题所在:我需要将属性放在接口上,而不是(必须)放在实现类上。

如下图调整界面即可解决。

[InheritedExport]
public interface ILogger
{
    void Write(string message, [CallerMemberName] string methodName = "", [CallerFilePath] string srcFilePath = "", [CallerLineNumber] int srcLineNumber = 0, params object[] args);
}
于 2012-10-04T14:40:33.230 回答