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

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

var name = "Joe"; var template = "Hi {name}"; 

然后我想做类似的事情:

 var result = $template; 

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

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

简短的回答:不,你不能做你提出的建议。

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

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

 "Hi {0}" 

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

 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}" 

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

 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( "var name = \"" + name + "\"; " + "return $\"" + template + "\";"); 

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

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