C#自带的string.Format可以格式化字符串,但是还是不太好用,由于格式的字符占位符都是数字,当数目较多时容易混淆。其实可以扩展string的方法,让C#的字符串具备其他的方法,下面介绍一个实现类似String.jQueryStringFormat("hello $world", new {world="cnblog" })的扩展方法。

1 变量前缀$

可以仿照jQuery中的选择器方法,用$作为变量前缀。例如 I love \$something 中的$someting就是变量,可以将something变量的值替换到字符串中。

 //模板字符串前缀
private static readonly string __prefix = "$";
// $ 正则表达式 $name
private static readonly Regex VariableRegex = new Regex(@"\$(@{0,1}[a-zA-Z_\.0-9]+)");

2 正则表达式捕获变量

上面定义了变量的规则,必须是$打头的有效变量,下面将字符串用该正则表达式进行捕获

 private static IEnumerable<string> GetEnumerateVariables(string s)
{
var matchCollection = VariableRegex.Matches(s); for (int i = ; i < matchCollection.Count; i++)
{
yield return matchCollection[i].Groups[].Value;
}
}

3 用反射获取对象属性的值

传入的对象含有各个属性,写一个方法获取指定属性的值

         /// <summary>
/// 获取对象的对应属性值
/// </summary>
/// <param name="oValue">包含值的对象</param>
/// <param name="name">属性名</param>
/// <returns></returns>
private static object ValueForName(object oValue, string name)
{
Type type = oValue.GetType();
var property = type.GetProperty(name);
if (property != null)
{
return property.GetValue(oValue, new object[]);
} var field = type.GetField(name);
if (field != null)
{
return field.GetValue(oValue);
}
throw new FormatException("未找到命名参数: " + name);
}

4 String方法扩展

         public static string jQueryStringFormat(this String @this, string sjQueryStringT, object oValue)
{ //检测验证
if (string.IsNullOrEmpty(sjQueryStringT))
return sjQueryStringT;
if (!sjQueryStringT.Contains(__prefix))
throw new Exception("字符串中变量不包含$前缀");
if (oValue == null)
return sjQueryStringT; //解析
//need using System.Linq;
var variables = GetEnumerateVariables(sjQueryStringT).ToArray();
foreach (string vname in variables)
{
//获取值
string vvalue = ValueForName(oValue, vname).ToString();
//字符串替换
sjQueryStringT = sjQueryStringT.Replace("$" + vname, vvalue); }
return sjQueryStringT;
}

5 单元测试

其实在VS2012中可以自动生成单元测试代码,然后稍加改动就可以对编写的方法进行单元测试,非常方便

        /// <summary>
///jQueryStringFormat 的测试
///</summary>
[TestMethod()]
public void jQueryStringFormatTest()
{
string @this = ""; // TODO: 初始化为适当的值 string Name = "JackWang";
int ID = ;
string sjQueryStringT = "exec func($Name,$$ID)"; // TODO: 初始化为适当的值
object oValue = new { ID, Name }; // TODO: 初始化为适当的值
string expected = "exec func(JackWang,$100)"; // TODO: 初始化为适当的值
string actual;
actual = StringFormat.jQueryStringFormat(@this, sjQueryStringT, oValue);
Assert.AreEqual(expected, actual);
//Assert.Inconclusive("验证此测试方法的正确性。");
}

6 应用示范

 string Name = "jack";
int ID = ;
string template = "exec func($Name,$ID)";
string parseText = template.jQueryStringFormat(template, new { ID, Name });

也可以传入一个类的实例

 template = "the $Name who ID is $$ID";
parseText = template.jQueryStringFormat(template, new Person { ID = "", Name = "JackWang" });

7 GitHub开源

项目源码放于GitHub中https://github.com/JackWangCUMT/jQueryStringFormat

C#实现类似"hello $world"的格式化字符串方法的更多相关文章

  1. WPF中Binding使用StringFormat格式化字符串方法

    原文:WPF中Binding使用StringFormat格式化字符串方法 货币格式 <TextBlock Text="{Binding Price, StringFormat={}{0 ...

  2. JavaScript ES6格式化字符串方法

    js想要动态更新文本内容,在ES5中没有格式化字符串的方法,在ES6中是有字符串格式化的方法的. 使用左上角数字1旁边的符号定义字符串.先定义好需要拼接的字符串,在字符串内部使用 ${变量名} 进行拼 ...

  3. Python的3种格式化字符串方法

    Python中有3种format字符串的方式: 传统C语言式 命名参数 位置参数 1. 传统C语言式 和c语言里面的 sprintf 类似,参数格式也一样 title = "world&qu ...

  4. [转]Python的3种格式化字符串方法

    本文转自: 夏日微风Python笔记 传统C语言式 命名参数 位置参数 1. 传统C语言式 和c语言里面的 sprintf 类似,参数格式也一样 title = "world" y ...

  5. Qt sprintf_s函数格式化字符串出错

    Qt sprintf_s函数格式化字符串出错 问题的出现: 我在VS上用c C++写的跨平台的函数 移植到Qt 上面 出现sprintf_s 函数格式化出错. 开始以为是编码问题  反复查找Qt乱码问 ...

  6. JavaScript 实现格式化字符串函数String.format (解决引号嵌套转义符问题)

    在js开发中,我们可能会遇到这样一个问题 当需要通过js动态插入html标签的时候 特别是当遇到大量的变量拼接.引号层层嵌套的情况,会出现转义字符问题,经常出错 我们来看个例子 <!DOCTYP ...

  7. VBA 格式化字符串 - Format大全

    VBA 格式化字符串 VBA 的 Format 函数与工作表函数 TEXT 用法基本相同,但功能更加强大,许多格式只能用于VBA 的 Format 函数,而不能用于工作表函数 TEXT ,以下是本人归 ...

  8. sprintf格式化字符串带来的注入隐患

    原文链接:https://paper.seebug.org/386/ 摘要点关键知识点 <?php $input = addslashes("%1$' and 1=1#"); ...

  9. python 使用json.dumps() 的indent 参数,获得漂亮的格式化字符串后输出

    想获得漂亮的格式化字符串后输出,可以使用json.dumps() 的indent 参数.它会使得输出和pprint() 函数效果类似 >>> data {'age': 4, 'nam ...

随机推荐

  1. font-size:100%有什么作用

    h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:normal;} input,select,textarea,samp {font-size:100%;} ...

  2. JAVA设计模式《四》

    经过前几篇的介绍相信大家对JAVA的设计模式一定有所解了,本篇我们再一起学习一下适配器模式.代理模式和工厂模式. 适配器模式使用的场景非常多,例如现实生活中,我们的笔记本电脑的充电线大部分都是三向插头 ...

  3. MongoDB的学习--索引类型和属性

    索引类型 MongDB的索引分为以下几种类型:单键索引.复合索引.多键索引.地理空间索引.全文本索引和哈希索引 单键索引(Single Field Indexes) 在一个键上创建的索引就是单键索引, ...

  4. 数据可视化(7)--D3基础

    一直想写写D3,觉得D3真心比较强大,基本上你能想出来的图表都能绘制出来,只不过使用起来比前几个要稍麻烦一点. 正好最近读完了<数据可视化实战>,将关于D3的知识梳理了一遍,写这篇博客记录 ...

  5. 24个 HTML5 & CSS3 下拉菜单效果及制作教程

    下拉菜单是一个很常见的效果,在网站设计中被广泛使用.通过使用下拉菜单,设计者不仅可以在网站设计中营造出色的视觉吸引力,但也可以为网站提供了一个有效的导航方案.使用 HTML5 和 CSS3 可以更容易 ...

  6. 百度统计接口demo中错误

    百度统计接口中的demo(PHP版本)下载下来配置后运行出错,应该是编写demo时用的php版本比较低吧,作如下几处修改就好了 一:把CURLOPT_SSL_VERIFYHOST的值改为2,因为1版本 ...

  7. HTML5 Web 客户端五种离线存储方式汇总

    最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及Fi ...

  8. 深入分析MVC中通过IOC实现Controller依赖注入的原理

    这几天利用空闲时间,我将ASP.NET反编译后的源代码并结合园子里几位大侠的写的文章认真的看了一遍,收获颇丰,同时也摘要了一些学习内容,存入了该篇文章:<ASP.NET运行机制图解>,在对 ...

  9. Make something people want

    <黑客与画家>开头首先介绍了书的作者格雷厄姆的其人其事,他的成长涉猎很多,大学学哲学,研究生学计算机,博士时对绘画感兴趣,后来做了两年画家,但是入不敷出,后来他和朋友开始合伙开发一个搭建网 ...

  10. JAVA - 优雅的记录日志(log4j实战篇)

    写在前面 项目开发中,记录错误日志有以下好处: 方便调试 便于发现系统运行过程中的错误 存储业务数据,便于后期分析 在java中,记录日志有很多种方式: 自己实现 自己写类,将日志数据,以io操作方式 ...