微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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",""));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐