使用MEF时CallerMemberNameAttribute为空?

时间:2012-10-04 12:37:47

标签: logging mef .net-4.5

我正在试验这些新的.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]属性的可选参数。

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

有什么想法吗?或者这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

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

按如下所示调整界面将其固定。

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