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",""));
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
