我的应用程序需要允许用户输入和保存通用参数化字符串。
在 .NET 中执行此操作的最佳方法是什么?
目前我允许用户将带有预定义“参数”的字符串输入到文本框中。
例如。“嗨 %%Name%%,请拿起你的订单号 %%Order%%。”
然后存储这个通用字符串,然后在需要时用真实数据填充。人口只是通过一系列这些类型的语句来完成:
Str1.Replace("%%Name%%", data.Name)
Str1.Replace("%%Order%%", data.Order)
我的应用程序需要允许用户输入和保存通用参数化字符串。
在 .NET 中执行此操作的最佳方法是什么?
目前我允许用户将带有预定义“参数”的字符串输入到文本框中。
例如。“嗨 %%Name%%,请拿起你的订单号 %%Order%%。”
然后存储这个通用字符串,然后在需要时用真实数据填充。人口只是通过一系列这些类型的语句来完成:
Str1.Replace("%%Name%%", data.Name)
Str1.Replace("%%Order%%", data.Order)
您在寻找格式字符串吗?
string str = String.Format("five = {0} hello {1}", 5, "World");
或者
string base = "five = {0} hello {1}"
string str = String.Format(base, 5, "World");
你所拥有的是“足够好”......你只需要记住将 Replace() 调用的结果分配回原来的:
Str1 = Str1.Replace("%%Name%%", data.Name)
Str1 = Str1.Replace("%%Order%%", data.Order)
您可以通过将其实现为状态机来获得更好的性能,但所涉及的复杂性不太可能证明它是合理的,而且我同样觉得功能齐全的模板库在这里可能有点矫枉过正。雅尼
如果我要推荐不同的语法,我可能会使用前导 @ 符号或问号来匹配常见的数据库参数语法。或者,如果您可以忍受索引参数而不是命名参数,则可以按照另一个答案中的建议使用 String.Format() 。
Stack Overflow 上的其他地方也有类似的问题。这是在https://stackoverflow.com/a/4077118/1721527上对Dogget部分答案的修改
定义一个这样的函数:
public string Format(string input, object p)
{
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(p))
{
input = input.Replace("%%" + prop.Name + "%%", (prop.GetValue(p) ?? "(null)").ToString());
return input;
}
}
像这样称呼它:
Format("test %%first%% and %%another%%", new { first = "something", another = "something else" })
根据用例的复杂性,您可能希望使用模板库,例如NVelocity、StringTemplate或类似的。
使用 NVelocity,您可以拥有这样的模板:
"Hi $data.Name, please pick up your order number $data.Order."
然后您只需将您的模板和data
对象传递给 NVelocity 引擎并让它替换占位符。