带模板的字符串插值

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是官方文档。

【讨论】:

这对我来说是个问题,因为我不知道模板会有多少占位符,或者应该使用哪些属性。 这就是为什么我说你不能这样做,你需要为此编写代码来定义你想如何获取对象的属性。

以上是关于带模板的字符串插值的主要内容,如果未能解决你的问题,请参考以下文章

Angular 4:带插值的动态模板

在编译字符串插值实例时,Coffeescript是否始终使用ES6模板文字?

使用字符串插值将控件从FormGroup绑定到* ngFor内的模板

模板字面量(模板字符串)

模板字面量(模板字符串)

2019-11-22组件与模板 -- 显示数据