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. maven+spring+springMVC+mybatis+dubbox

      milestone 2016612  dubbox+spring+mybatis provider调通

  2. 深入理解CSS中的长度单位

    前面的话 本文分为绝对长度单位和相对长度单位来介绍CSS中的长度单位的主要知识 绝对长度单位 绝对长度单位代表一个物理测量 像素px(pixels) 在web上,像素px是典型的度量单位,很多其他长度 ...

  3. 移动web开发之像素和DPR

    × 目录 [1]定义 [2]分类 [3]缩放[4]DPR 前面的话 像素在web开发中几乎天天用到,但到底什么是像素,移动端和桌面端的像素有区别吗,缩放对像素有影响吗,视网膜屏幕和像素有什么关系?关于 ...

  4. js连续指定两次或者多次的click事件(解决办法)

    setTimeout (表达式,延时时间)setTimeout(表达式,交互时间)延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTimeout  在执行时,是在载入后延迟指定时间后, ...

  5. 简单几步把LOGO变字体

    今天学到一招,所以决定简单写写如何利用图标字体生成器IcoMoon把自己制作的图标变成字体,下面以OSChina的图标为例. 一.确保logo转成纯色,并保存为svg格式 因为OSC的logo是绿色带 ...

  6. 实现UniqueAttribute唯一性约束-优化版

    我之前就写过一篇<实现UniqueAttribute唯一性约束>,虽然实现了通过调用IsValid方法可以进行唯一性验证,但有一个缺点,那就是耦合度过高,原因是里面的DB上下文对象是直接写 ...

  7. C# 目录(文件夹)复制实现

    private static void CopyDir(DirectoryInfo origin, string target) { if (!target.EndsWith("\\&quo ...

  8. 线程池ThreadPool的初探

    一.线程池的适用范围 在日常使用多线程开发的时候,一般都构造一个Thread示例,然后调用Start使之执行.如果一个线程它大部分时间花费在等待某个事件响应的发生然后才予以响应:或者如果在一定期间内重 ...

  9. 在Excel中使用频率最高的函数的功能和使用方法

    在Excel中使用频率最高的函数的功能和使用方法,按字母排序: 1.ABS函数 函数名称:ABS 主要功能:求出相应数字的绝对值. 使用格式:ABS(number) 参数说明:number代表需要求绝 ...

  10. Redis系列一之数据结构

    一.Redis简介 redis是一个高性能的key-value非关系数据库,它可以存键(key)与5种不同类型的值(value)之间的映射(mapping),支持存储的value类型包括:String ...