簡體   English   中英

"C#中具有可變內容的字符串插值"

[英]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.FormatString.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM