利用RazorEngine更加直观的格式化字符串

在.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。

 

你可能感兴趣的:(利用RazorEngine更加直观的格式化字符串)