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. Android入门(十三)内容提供器

    原文链接:http://www.orlion.ga/612/ 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一 ...

  2. PHP内核(一)内存管理

    本文链接:http://www.orlion.ml/tag/php-internal/ 一.内存管理基础 用c语言开发时,开发者要手动进行内存管理.PHP经常作为web服务器的模块,内存管理与预防内存 ...

  3. Struts2第一个例子Hello World!

    1.首先用eclipse新建一个动态web项目Struts2Demo1: (把Default output floder由build\classes改成WebContent\WEB-INF\class ...

  4. Strophe.js连接XMPP服务器Openfire、Tigase实现Web私聊、群聊(MUC)

    XMPP(Extensible Messaging and Presence Protocol)是一种网络即时通讯协议,它基于XML,具有很强的扩展性,被广泛使用在即时通讯软件.网络游戏聊天.Web聊 ...

  5. Zookeeper-Zookeeper client

    当我写完Zookeeper leader选举后,准备看看Zookeeper的存储和处理客户端请求的时候发现,如果能看看Zookeeper的API是不是在理解后面的过程更好些呢. Zookeeper的c ...

  6. Spring学习总结(四)——表达式语言 Spring Expression Language

    SpEL简介与功能特性 Spring表达式语言(简称SpEL)是一个支持查询并在运行时操纵一个对象图的功能强大的表达式语言.SpEL语言的语法类似于统一EL,但提供了更多的功能,最主要的是显式方法调用 ...

  7. nodemailer实现node发送邮件

    作为一个前端er,利用node独立做一些全栈小项目,是很有效率和必要的. 需要: 做一个活动报名页面,用户填好的表单需要被工作人员收到,一想到把数据存数据库,还需要给工作人员写一个管理页面就觉得很麻烦 ...

  8. Sybase 数据库新增用户,赋权

    Sybase数据库, 需求:新增用户user1,赋予对原数据库中表t_jingyu的查询权限 数据库原用户登陆 isql -U用户 -P密码 -S服务名 sp_addlogin 'user1','us ...

  9. td中绝对定位div的垂直居中问题

    一.需求 典型的注册页面设计一般是一个三列多行的表格,左列为表单项label,中列为文本框,右列为填写说明和验证提示.如下图 因为整个表单的视觉重心在左中两列,所以在考虑表单整体相对页面水平居中和注册 ...

  10. tomcat6类加载器与类加载顺序

    tomcat6.0.32 com.dyyx.ShareUtils//返回系统当前时间public static String now(); package com.dyyx;import java.t ...