我正在试验这些新的.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]属性的可选参数。
但是,这不会发生,所有值都设置为默认值。
有什么想法吗?或者这是一个错误吗?
答案 0 :(得分:2)
我最终发现了问题所在:我需要将属性放在接口上,而不是(必然)放在实现类上。
按如下所示调整界面将其固定。
[InheritedExport]
public interface ILogger
{
void Write(string message, [CallerMemberName] string methodName = "", [CallerFilePath] string srcFilePath = "", [CallerLineNumber] int srcLineNumber = 0, params object[] args);
}