【问题标题】:How can I use a string format as an argument without string concatenation inside curly braces?如何在大括号内不使用字符串连接的情况下使用字符串格式作为参数?
【发布时间】:2013-12-05 21:50:36
【问题描述】:

我希望最终用户能够指定自定义日期时间格式以输出到日志文件。 (它控制如何将日期时间戳添加到每一行。)

我正在使用带有一些连接的 String.Format,这会导致 ReSharper 警告关于不匹配的大括号。必须有更合适的方法来处理这个问题,但我找不到它。

string _entry = "Some event.";

public string GetFormattedEntry(string stampFormat)
{
    return String.Format("{0:" + stampFormat + "}: {1}", DateTime.Now, _entry);
}

这个想法是可以使用用户指定的格式字符串来调用它,例如“yyyy-MM-dd HH:mm:ss”,这将导致:

2013-12-05 14:47:57 一些事件。

问题在于 ReSharper 不喜欢拆分大括号的用法(我也不喜欢)。感觉就像一个黑客。有没有更好的方法将字符串格式传递给方法并使用它来格式化返回值?

(请注意,用户指定的字符串在假定它可用之前已经过验证。)

编辑:

为了简洁起见,我已经简化了代码示例。实际的方法迭代一个对象集合并相应地格式化每个对象。它还执行涉及富文本格式等的其他功能,此处不相关。

【问题讨论】:

  • 你为什么要在你想成为格式字符串的字符串上调用String.Format?当然,您应该只返回字符串。
  • @ChrisF 为了简单起见,我删除了大部分代码; real 方法迭代对象列表,格式化与每个对象关联的 DateTime 并将其添加到日志条目字符串的前面。它执行的其他格式化功能包括添加行号或其他故障排除信息。
  • @millimoose 它按原样工作得很好,所以我可以不用管它。但是,为了代码的可读性和可靠性,我想知道是否有更清晰的方法来做到这一点。
  • @JYelton 在这些情况下,我将恢复我的策略,即保持黑客本地化封装

标签: c# .net winforms


【解决方案1】:

您是否考虑过DateTime.ToString(string format) 的用法:

public string GetFormattedEntry(string stampFormat)
{
    return String.Format("{0}: {1}", DateTime.Now.ToString(stampFormat), _entry);
}

【讨论】:

  • 这不仅简单,而且您阅读了我在原始帖子中未包含日期变量的错误。谢谢。
  • @Konrad Kokosa - 这是一个很棒的答案。如果我可以多次投票,我会的。无论如何,+1。
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多