加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 可选参数以及一系列参数

发布时间:2020-12-15 21:46:17 所属栏目:百科 来源:网络整理
导读:我有一个日志记录界面,我扩展了一些有用的扩展方法,使我可以传入一个格式和一个参数列表,以避免每次调用方法时都必须使用字符串格式. (它也帮助我遵循FXCops文化信息规则) 所以我可以打电话: logger.Debug("Created {0} with id {1}",typeof(MyObject).Name
我有一个日志记录界面,我扩展了一些有用的扩展方法,使我可以传入一个格式和一个参数列表,以避免每次调用方法时都必须使用字符串格式. (它也帮助我遵循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",""));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读