C#中带有可变内容的字符串插值

Ton*_*ugg 9 c#

可以将字符串的模板存储在变量中并使用插值吗?

var name = "Joe";
var template = "Hi {name}";
Run Code Online (Sandbox Code Playgroud)

然后我想做一些事情:

var result = $template;
Run Code Online (Sandbox Code Playgroud)

原因是我的模板将来自数据库.

Dou*_*las 9

这可以使用动态编译按要求完成,例如通过Microsoft.CodeAnalysis.CSharp.Scripting包.例如:

var name = "Joe";
var template = "Hi {name}";
var result = await CSharpScript.EvaluateAsync<string>(
    "var name = \"" + name + "\"; " +
    "return $\"" + template + "\";");
Run Code Online (Sandbox Code Playgroud)

请注意,这种方法很慢,您需要添加更多逻辑来处理字符串中引号(和注入攻击)的转义,但上述内容可作为概念验证.


Mas*_*aus 7

我猜这些字符串即使可以更改也将始终具有相同数量的参数。例如,今天template"Hi {name}",明天可能是"Hello {name}"

简短的回答:不,您不能做您建议的事情。

备选方案1:使用string.Format方法。

您可以在数据库中存储以下内容:

"Hi {0}"
Run Code Online (Sandbox Code Playgroud)

然后,当您从数据库中检索字符串模板时,可以编写:

var template = "Hi {0}"; //retrieved from db
var name = "Joe";
var result = string.Format(template, name);
//now result is "Hi Joe"
Run Code Online (Sandbox Code Playgroud)

有2个参数:

var name2a = "Mike";
var name2b = "John";
var template2 = "Hi {0} and {1}!"; //retrieved from db
var result2 = string.Format(template2, name2a, name2b);
//now result2 is "Hi Mike and John!"
Run Code Online (Sandbox Code Playgroud)

替代方案2:使用占位符。

您可以在数据库中存储以下内容:

"Hi {name}"
Run Code Online (Sandbox Code Playgroud)

然后,当您从数据库中检索字符串模板时,可以编写:

var template = "Hi {name}"; //retrieved from db
var name = "Joe";
var result = template.Replace("{name}", name);
//now result is "Hi Joe"
Run Code Online (Sandbox Code Playgroud)

具有3个参数:

var name2a = "Mike";
var name2b = "John";
var template2 = "Hi {name2a} and {name2b}!"; //retrieved from db
var result2 = template2
    .Replace("{name2a}", name2a)
    .Replace("{name2b}", name2b);
//now result2 is "Hi Mike and John!"
Run Code Online (Sandbox Code Playgroud)

请注意为占位符选择的令牌。在这里,我使用了大括号{}。您应该找到一些不太可能与其余文本发生冲突的东西。这完全取决于您的情况。


Hun*_*Cao 2

不,你不能这样做,因为它需要name在创建字符串时(编译时)的值。考虑使用String.FormatorString.Replace代替。