带模板的字符串插值
Posted
技术标签:
【中文标题】带模板的字符串插值【英文标题】:String interpolation with template 【发布时间】:2022-01-10 13:51:34 【问题描述】:我想在模板中使用字符串插值,但无法正常工作。我有以下代码:
public string Parse(string template, params dynamic[] objects)
return $"text text objects[0].PropertyOne objects[0].PropertyThree text text";
这很好用,但我想使用传递给方法的字符串模板,所以我似乎需要这样的东西:
public string Parse(string template, params dynamic[] objects)
return string.Format(template, objects[0].PropertyOne, objects[0].PropertyThree);
但我不知道将传递多少个参数,或者使用哪些属性(因此是动态类型)。我需要这样的东西:
public string Parse(string template, params dynamic[] objects)
// template = "text text objects[0].PropertyOne objects[0].PropertyThree text text"
return string.Format(template, objects);
我到处都说字符串插值只是 string.Format 的抽象,或者它最终使用 string.Format,所以听起来像这样的事情应该是可能的。我可以不经过反思就做我的目标吗?
【问题讨论】:
String.Format 需要数字占位符(0
等),不能指定变量或表达式
我不明白你为什么要编写一个采用格式化模板和 N 参数的方法;这就是 string.Format 所做的。为了使您的代码成为返回字符串的单行,输入参数的格式使其特别没有意义-而不是调用您的 Parse() (顺便说一句,这似乎是一个非常不正确的名称;这是 opposite 解析) 方法,调用站点应该只调用 string.Format 本身,或者在其本地具有的变量上使用插值字符串
如果您的方法有一些价值要添加,那么您应该查看 FormattableString,但请确保您确实有它的用例。例如,Entity Framework 在执行原始 SQL 时充分利用了可格式化的字符串;在格式化之前访问占位符字符串对于防止 sql 注入很重要,以便可以将其制成参数化语句
【参考方案1】:
你不能像你在问题中提到的那样让它动态化。
你可以这样做
// template = "text text 0 1 text text"
String.Format(template, objects[0].PropertyOne, objects[0].PropertyThree);
Here是官方文档。
【讨论】:
这对我来说是个问题,因为我不知道模板会有多少占位符,或者应该使用哪些属性。 这就是为什么我说你不能这样做,你需要为此编写代码来定义你想如何获取对象的属性。以上是关于带模板的字符串插值的主要内容,如果未能解决你的问题,请参考以下文章
在编译字符串插值实例时,Coffeescript是否始终使用ES6模板文字?