我有一个日志记录界面,我扩展了一些有用的扩展方法,使我可以传入一个格式和一个参数列表,以避免每次调用方法时都必须使用字符串格式. (它也帮助我遵循FXcops文化信息规则)
所以我可以打电话:
logger.Debug("Created {0} with id {1}",typeof(MyObject).Name,myObject.Id);
代替:
logger.Debug(string.Format("Created {0} with id {1}",myObject.Id));
我现在发现自己处于一个棘手的状态,因为在日志中获取有关日志写入位置的一些信息(例如文件,方法和行号)会非常有帮助.这可以通过整洁的[CallerMemberName],[CallerFilePath]和[CallerLineNumber]属性来实现.
logger.Debug("Created {0} with id {1}",myObject.Id);
然后会给我一个日志条目,例如:
“MyObjectProvider.cs,Provide,line: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 arg,string arg2,...etc...,[CallerLineNumber] int callerLineNumber = 0)
但后来我得到编译器错误,说“以下方法或属性之间的调用是模糊的”
我现在几乎放弃了这个问题,但我心想,“也许我可以为我找到一个解决方案”.所以这里是……是否有可能以任何方式使用params object [] args和[CallerFilePath],还是有另一种方法来获得预期的结果?
解决方法
您不能在方法签名中组合这两者.你可以做的是一个或另一个并传入null到你需要可选参数的地方,这对你有用吗?
Foo(s,null); public void Foo(string s,params string[] sArray) { } Foo(new string[] {""}); private static void Foo(string[] sArray,string s = "") { }
要么
为什么不使用一个处理格式化的类并使其可选?
public class LogArgs { private string _formatString; private string[] _args; public LogArgs(string formatString,params string[] args) { _formatString = formatString; _args = args; } public override string ToString() { return string.Format(_formatString,_args); } } public void Foo(string mandatory,LogArgs optionalParam = null) { //Do Stuff } Foo("",new LogArgs("{0} is formatted",""));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。