在.net中,我们可以使用string.Format函数来格式化字符串,一个简单的示例如下:
string template = "Hello {0}! Welcome to C#!";
string result = string.Format(template, "World");
这种格式化的方式对于字符串模板较短的时候还算比较简洁,但是一旦遇到像邮件这样比较大的模板的时候,一大堆的{0},{1},{2}就有点令人眼花缭乱了。这种情况下,往往需要一种有意义的变量来代表这种{0}, {1} {2}的数字。
string template = "Hello %Name%! Welcome to C#!";
string result = template.Replace("%Name%", "World");
这种方式的通用性不是很强,但比较简单,今天在这里推荐一个通用性较好的方案——RazorEngine。
string template = "Hello @Model.Name! Welcome to Razor!";
string result = Razor.Parse(template, new { Name = "World" });
当然,RazorEngine的功能远不止如此,更多的是用它打造代码生成器,感兴趣的朋友可以参看下这篇文章:http://blog.csdn.net/fangxing80/article/details/7093666。
重复轮子
我一般用到这种大文本模板的地方往往是自己编写一些小工具时,动态生成并调用批处理文件。本身RazorEngine能满足我的要求,但我一般喜欢生成一个单一的Exe文件,然后把Exe文件丢到需要批量处理的文件夹中执行,并不希望顺便带上几个Dll,也用不到RazorEngine里面的那些高级功能。因此,我这里就借鉴了一下RazorEngine的语法,做了一个重复轮子:
static class StrFormater
{
public static string Format(string template, object data)
{
return Regex.Replace(template, @"@([\w\d]+)", match => GetValue(match, data));
}
static string GetValue(Match match, object data)
{
var paraName = match.Groups[1].Value;
try
{
var proper = data.GetType().GetProperty(paraName);
return proper.GetValue(data).ToString();
}
catch (Exception)
{
var errMsg = string.Format("找不到名为'{0}'的值", paraName);
throw new ArgumentException(errMsg);
}
}
}
使用这个类也非常简单:
string template = "Hello @Name! Welcome to C#!";
string result = StrFormater.Format(template, new { Name = "World" });
模板中把要替换的属性前面加一个'@'符号即可,并不需要像RazorEngine那样加Model。