c# – 可选参数以及一系列参数
我有一个日志记录界面,我扩展了一些有用的扩展方法,使我可以传入一个格式和一个参数列表,以避免每次调用方法时都必须使用字符串格式. (它也帮助我遵循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","")); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |