[英]String Interpolation With Variable Content in C#
可以將字符串的模板存儲在變量中並對其使用插值嗎?
var name = "Joe";
var template = "Hi {name}";
我猜這些字符串將始終具有相同數量的參數,即使它們可以更改。 例如,今天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 + "\";");
請注意,這種方法很慢,您需要添加更多邏輯來處理字符串中引號的轉義(和注入攻擊),但以上內容用作概念驗證。
不,您不能這樣做,因為它在創建字符串時(編譯時)需要name
值。 考慮使用String.Format
或String.Replace
代替。
我只是在我的應用程序中有同樣的需求,所以將使用String.Replace()
分享我的解決方案。 如果您能夠使用 LINQ,那么您可以將Aggregate方法(如果您熟悉函數式編程,它是一個減少函數)與提供您想要的替換的 Dictionary 結合使用。
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"
這是通過從template
開始,然后迭代替換字典中的每個項目,替換每個項目的出現來工作的。 一次Replace()
調用的結果被送入到下一次的輸入中,直到執行所有替換。
{{{pair.Key}}}
位只是為了轉義用於查找占位符的{
和}
。
這現在已經很老了,但是當我剛剛遇到它時,它對我來說是新的!
對於您需要的東西來說,這有點矯枉過正,但我已經將Handlebars.NET<\/a>用於此類事情。
您可以為上下文創建相當復雜的模板並合並到分層數據結構中。 循環和條件部分、部分模板合成甚至輔助函數擴展點都有規則。 它還可以優雅地處理許多數據類型。
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.