可以将字符串的模板存储在变量中并对其进行插值吗?
var name = "Joe";
var template = "Hi {name}";
然后我想做类似这样的事情:
var result = $template;
原因是我的模板将来自数据库。
我猜这些字符串的参数数量始终相同,即使它们可能会更改。例如,今天template
是"Hi {name}"
,而明天可能是"Hello {name}"
。
简短的回答:不能按照你提出的方式实现。
备选方案1:使用string.Format方法。
您可以在数据库中存储类似以下内容:
"Hi {0}"
然后,当你从数据库中检索字符串模板时,你可以编写:
var template = "Hi {0}"; //retrieved from db
var name = "Joe";
var result = string.Format(template, name);
//now result is "Hi Joe"
带有 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!"
替代方案2:使用占位符。
您可以在数据库中存储类似以下内容的数据:
"Hi {name}"
然后,当您从数据库中检索字符串模板时,可以编写:
var template = "Hi {name}"; //retrieved from db
var name = "Joe";
var result = template.Replace("{name}", name);
//now result is "Hi Joe"
有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!"
请注意选择用于占位符的标记。在这里,我使用了大括号 {}
。您应该找到一些不太可能与您的其余文本发生冲突的内容。这完全取决于您的上下文。
Microsoft.CodeAnalysis.CSharp.Scripting
包。例如:var name = "Joe";
var template = "Hi {name}";
var result = await CSharpScript.EvaluateAsync<string>(
"var name = \"" + name + "\"; " +
"return $\"" + template + "\";");
请注意,这种方法速度较慢,您需要添加更多的逻辑来处理字符串中引号(和注入攻击)的转义,但上述内容可以作为概念验证。
EvaluateAsync
方法接收一个不可变字符串作为参数,因此对于原始变量的任何后续更改都是不受影响的。该代码是线程安全的。 - DouglasString.Replace()
。如果您能够使用 LINQ,则可以使用Aggregate方法(它是一个减少函数,如果您熟悉函数式编程),结合提供所需替换的字典。string template = "Hi, {name} {surname}";
Dictionary<string, string> substitutions = new Dictionary<string, string>() {
{ "name", "Joe" },
{ "surname", "Bloggs" },
};
string result = substitutions.Aggregate(template, (args, pair) =>
args.Replace($"{{{pair.Key}}}", pair.Value)
);
// result == "Hi, Joe Bloggs"
模板
开始,然后迭代替换字典中的每个项目,替换每个出现的内容来实现的。一个Replace()
调用的结果被馈送到下一个输入中,直到所有替换都完成。
{{{pair.Key}}}
部分只是为了转义用于查找占位符的{
和}
。不行,因为这需要在字符串创建时(编译时)具有name
值。考虑使用String.Format
或String.Replace
。
var source = @"Hello {{Guest.FirstName}}{{#if Guest.Surname}} {{Guest.Surname}}{{/if}}!";
var template = Handlebars.Compile(source);
var rec = new {
Guest = new { FirstName = "Bob", Surname = null }
};
var resultString = template(rec);
{{fieldName}}
,只是您也可以做更多的事情。