.NET是否提供模板字符串的命名参数替换内置功能?
.NET 命名模板参数替换的实现方案
.NET 本身没有提供直接支持命名模板参数替换的内置API,但可以通过以下几种可靠方式实现,同时覆盖特殊字符处理、参数不存在等边界情况:
1. 正则表达式实现(推荐)
利用System.Text.RegularExpressions.Regex可以精准匹配命名参数,同时处理参数值中的特殊字符,避免替换逻辑出错。以下是完整实现:
using System.Text.RegularExpressions; using System.Collections.Generic; public static string PerformSubstitution(string templateText, Dictionary<string, string> parameterNamesAndValues) { // 匹配<参数名>格式的模板标记,支持字母、数字、下划线 return Regex.Replace(templateText, @"<(\w+)>", match => { string paramName = match.Groups[1].Value; // 存在对应参数则替换,否则保留原标记 return parameterNamesAndValues.TryGetValue(paramName, out string value) ? Regex.Escape(value) // 转义值中的正则特殊字符,避免干扰后续匹配 : match.Value; }); }
使用示例
var myParams = new Dictionary<string, string> { { "name", "Dave" }, { "age", "34" } }; var str = PerformSubstitution("User <name> is <age> years old", myParams); // 输出:User Dave is 34 years old // 本地化资源场景 var localizedStr = PerformSubstitution(Strings.UserAgeDesc, myParams);
这个实现会自动忽略模板中不存在的参数(保留原标记),同时转义参数值中的特殊字符(比如$、*等),避免破坏正则匹配逻辑。
2. 基于String.Format的间接适配(需调整模板格式)
如果愿意将资源模板格式改为{参数名}(比如"User {name} is {age} years old"),可以通过正则先将命名参数转换为String.Format的索引格式,再调用内置方法:
public static string PerformNamedFormat(string templateText, Dictionary<string, string> parameterNamesAndValues) { var paramList = new List<string>(); var formattedTemplate = Regex.Replace(templateText, @"{(\w+)}", match => { string paramName = match.Groups[1].Value; if (parameterNamesAndValues.TryGetValue(paramName, out string value)) { paramList.Add(value); return $"{{{paramList.Count - 1}}}"; } return match.Value; }); return string.Format(formattedTemplate, paramList.ToArray()); }
这种方式复用了String.Format的内置格式化能力,但需要修改资源字符串的参数格式。
3. 注意事项
- 如果需要支持更复杂的参数格式(比如带空格的参数名、嵌套标记),可以调整正则表达式的匹配规则(比如将
\w+改为[\w\s]+)。 - 若参数值中包含模板标记本身(比如
<name>),正则转义会保留原字符,避免递归替换。
内容的提问来源于Stack Exchange,提问作者Mr. Boy
相关产品推荐
相关产品推荐

