我有一个日志接口,我使用一些有用的扩展方法对其进行了扩展,以便我可以传递格式和参数列表,以避免每次调用该方法时都必须使用字符串格式。(它也帮助我遵守 FXCops 文化信息规则)
所以我可以打电话:
logger.Debug("Created {0} with id {1}",typeof(MyObject).Name ,myObject.Id);
代替:
logger.Debug(string.Format("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id));
我现在发现自己处于一个有点棘手的境地,因为在日志中获取一些关于日志写入位置的信息(例如文件、方法和行号)将非常有帮助。这可以通过整洁[CallerMemberName]
的[CallerFilePath]
、 和[CallerLineNumber]
属性来实现。
logger.Debug("Created {0} with id {1}", typeof(MyObject).Name, myObject.Id);
然后会给我一个日志条目,例如:
“MyObjectProvider.cs,Provide,行:50 | 创建了 ID 为 1564 的 MyObject”
这里的问题是方法签名看起来像这样:
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "", [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0, params object[] args)
这是不可能的,因为[Caller*]
属性使参数成为可选的,并且不适用于 args 参数。
我还尝试使用固定数量的字符串作为参数进行多种实现,如下所示:
public static void Debug(this ILogger logger, string format [CallerMemberName] string callerMemberName = "",string arg, string arg2 , ...etc... , [CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = 0)
但随后我收到编译器错误,提示“以下方法或属性之间的调用不明确”
我现在几乎已经放弃了这个问题,但我想,“也许 SO 可以为我找到解决方案”。所以在这里......是否可以同时使用两者params object[] args
并[CallerFilePath]
以任何方式使用,或者是否有另一种方式来获得预期的结果?