【发布时间】:2018-03-16 12:41:50
【问题描述】:
我使用了一个模板字符串,从数据库和/或文本文件中读取:
var template="Your order {0} has dispatched from {1}, ETA {2:HH:MM dd.MM.yyyy}";
然后用string.Format(template, orderNo, warehouse, eta)
注入正确的值。
现在,我们做出了一项业务决策,即更改这些模板以使用更有意义的标记:
var template="Your order {orderNo} has dispatched from {warehouse}, ETA {eta:HH:MM dd.MM.yyyy}";
现在我不确定注入值的最佳方法是什么,例如,考虑到 eta 字段的格式是“硬编码”到模板中的(这样我们就可以使用不同的 @987654327 @ 格式取决于语言)
一个想法是将模板加载到StringBuilder,将命名变量替换为{0}, {1}..等的集合,然后使用旧的string.Format方法,但它并不是真正可扩展的,而且很难写完所有样板。
var formatTemplate = new StringBuilder(template)
.Replace("{orderNo}", "{0}")
.Replace("{warehouse}", "{1}")
.Replace("{eta","{2")
.ToString();
return string.Format(template, orderNo, warehouse, eta)
有没有更好的方法呢?也许一种将模板读取为插值字符串的方法?该字符串是从外部源读取的,因此我不能简单地使用 $"{marker}" 机制。
【问题讨论】:
-
为什么会很痛苦,为什么会有很多样板代码?
-
因为他们关心从系统发送到客户端的消息是什么,并且希望能够在系统之外定义它们。有时他们想改变它们,在某些语言中,标记的顺序不同,我想处理一组数字会让人感到困惑。编写样板文件的痛苦在于,当每个模板有 20 多个标记时,必须以正确的顺序全部替换它们。
-
另一个问题有建议试试
.Aggregate():stackoverflow.com/a/36778184/1462295 -
也可能是stackoverflow.com/a/159126/1462295中提到的Phil Haack的解决方案
标签: c# .net string-formatting string-interpolation