我的应用需要允许用户输入和保存通用参数化字符串。
在.NET中执行此操作的最佳方法是什么?
目前,我允许用户将带有预定义“参数”的字符串输入到文本框中。
例如。 “嗨%%名称%%,请提取您的订单号%%订单%%。”
然后存储此通用字符串,然后在需要时使用实际数据填充。人口只通过一系列这类陈述来完成:
Str1.Replace("%%Name%%", data.Name)
Str1.Replace("%%Order%%", data.Order)
答案 0 :(得分:3)
string str = String.Format("five = {0} hello {1}", 5, "World");
或者
string base = "five = {0} hello {1}"
string str = String.Format(base, 5, "World");
答案 1 :(得分:0)
你所拥有的是“足够好”......你只需要记住将Replace()调用的结果分配回原来:
Str1 = Str1.Replace("%%Name%%", data.Name)
Str1 = Str1.Replace("%%Order%%", data.Order)
通过将其作为状态机实现,可以获得更好的性能,但所涉及的复杂性不太可能证明它的合理性,而且我同样觉得像一个功能齐全的模板库在这里可能有些过分。 YAGNI
如果我建议使用不同的语法,我可能会使用前导@符号或问号来匹配常见的数据库参数语法。或者,如果您可以使用索引参数而不是命名参数,则可以按照另一个答案中的建议使用String.Format()。
答案 2 :(得分:0)
Stack Overflow上的其他地方也有类似的问题。以下是对Dogget
的https://stackoverflow.com/a/4077118/1721527答案的部分修改定义一个这样的函数:
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" })
答案 3 :(得分:0)
根据用例的复杂程度,您可能希望使用模板库,例如NVelocity,StringTemplate或类似的。
使用NVelocity,您可以拥有这样的模板:
"Hi $data.Name, please pick up your order number $data.Order."
然后,您只需将模板和data
对象传递给NVelocity enginge,然后让它替换占位符。