C# C语言中具有可变内容的字符串插值#

C# C语言中具有可变内容的字符串插值#,c#,.net,C#,.net,可以将字符串的模板存储在变量中并对其使用插值吗 var name = "Joe"; var template = "Hi {name}"; 然后我想做一些类似的事情: var result = $template; 原因是我的模板将来自数据库。不,您不能这样做,因为在创建字符串时(编译时),它需要name值。考虑使用字符串。格式化 >或代码>字符串。替换“< /代码>”。 < p>我猜这些字符串将具有相同数量的参数,即使它们可以更改。例如,今天的模板是“Hi{name}”,明天可能是“Hel

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

var name = "Joe";
var template = "Hi {name}";
然后我想做一些类似的事情:

var result = $template;

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

不,您不能这样做,因为在创建字符串时(编译时),它需要
name
值。考虑使用<代码>字符串。格式化<代码> >或代码>字符串。替换“< /代码>”。

< p>我猜这些字符串将具有相同数量的参数,即使它们可以更改。例如,今天的
模板
“Hi{name}”
,明天可能是
“Hello{name}”

简短回答:不,你不能按你的建议去做

备选方案1:使用该方法。

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

"Hi {0}"
"Hi {name}"
然后,当您从数据库检索字符串模板时,您可以编写:

var template = "Hi {0}"; //retrieved from db
var name = "Joe";
var result = string.Format(template, name);
//now result is "Hi Joe"
var template = "Hi {name}"; //retrieved from db
var name = "Joe";
var result = template.Replace("{name}", name);
//now result is "Hi Joe"
有两个参数:

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!"
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!"
备选方案2:使用占位符。

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

"Hi {0}"
"Hi {name}"
然后,当您从数据库检索字符串模板时,您可以编写:

var template = "Hi {0}"; //retrieved from db
var name = "Joe";
var result = string.Format(template, name);
//now result is "Hi Joe"
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 {0} and {1}!"; //retrieved from db
var result2 = string.Format(template2, name2a, name2b);
//now result2 is "Hi Mike and John!"
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!"

注意您为占位符选择的标记。在这里,我使用了周围的花括号
{}
。您应该找到一些不太可能与文本其余部分发生冲突的内容。这完全取决于您的上下文。

这可以根据请求使用动态编译来完成,例如通过包。例如:

var name = "Joe";
var template = "Hi {name}";
var result = await CSharpScript.EvaluateAsync<string>(
    "var name = \"" + name + "\"; " +
    "return $\"" + template + "\";");
var name=“Joe”;
var template=“Hi{name}”;
var result=await CSharpScript.evaluatesync(
“变量名称=\”“+name+”\”;”+
“return$\”“+模板+”\“;”;

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

我在我的应用程序中也有同样的需要,因此将使用
String.Replace()
共享我的解决方案。如果您能够使用LINQ,那么您可以使用该方法(如果您熟悉函数式编程,它是一个缩减函数)与提供所需替换的字典相结合

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"
string template=“Hi,{name}{lasname}”;
字典替换=新字典(){
{“名字”,“乔”},
{“姓氏”,“博客”},
};
字符串结果=替换。聚合(模板,(参数,对)=>
args.Replace($“{{{{pair.Key}}}”,pair.Value)
);
//结果==“嗨,乔·布洛格斯”
其工作原理是从
模板开始
,然后迭代替换字典中的每个项,替换每个项的出现。一个
Replace()
调用的结果被输入到下一个的输入中,直到执行了所有替换


{{{pair.Key}}}
位只是为了转义用于查找占位符的
{
}

不清楚您在问什么。您能否澄清哪些值来自数据库,以及您的预期输出是什么?谢谢您的回答。多年来我一直使用string.Format,字符串插值使代码更具可读性。我希望它能和一个模板变量作为字符串一起工作。当你有超过20个变量时,格式会变得非常难看并且容易出错。我可能会选择string.Replace作为每个变量,并自己替换模板占位符。@TonyLugg使用string.Replace而不是string.Format有什么好处?你会怎么用它,我很好奇。很抱歉回复晚了。我有很多变量需要在一个非常大的文档中替换。使用string.Format很难阅读,而且容易出错(顺序必须与源字符串中的{#}实例相匹配。替换self documents哪个变量被哪个替换字符串替换。super hack但是legit,我喜欢它;)请注意将您在项目中使用的.NET版本与此新编译器包的版本相匹配。请看这里:哦,还有一个后续问题:在使用这种方法时,是否需要采取任何措施使代码线程安全?@Wade:EvaluateAsync接收一个不可变的字符串作为其参数,因此它不会受到对原始变量的任何后续更改的影响。代码是线程安全的。我喜欢这个解决方案。允许轻松添加其他占位符,并避免循环。