c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展
2010-09-30 20:52:19 来源:WEB开发网调试执行一下:
与版本一类似,不过这里没有动态构建正则表达式,因为有了中括号,很容易区分常量和变量,所以我们通过“属性名”来找“属性”(对应代码中第10行)。如果某个属性找不到,我们会将这“[Name]”原样返回(对就第17行)。另一种做法是抛出异常,我不建议抛异常,在ToString(string format)是不合乎“常理”的。
版本二相对版本一效率有很大提高,主要是因为版本二只使用一个简单的正则表达式:@"\[(?<Name>[^\]]+)\]"。而版本一中的如果被扩展类的属性特别多,动态生成的正则表达式会很长,执行起来也会相对慢。
我们现在来解决两个版本中都存在的时间日期格式问题,把时间日期格式"yyyy-MM-dd"也放入中括号中,测试代码如下:
1 People p3 = new People { Id = 1, Name = "鹤冲天", Brithday = new DateTime(1990, 9, 9) };
2 string s3 = p3.ToString3("People:Id [Id: d4], Name [Name], Brithday [Brithday: yyyy-MM-dd]");
版本三实现代码:
1 public static string ToString3(this object obj, string format)
2 {
3 Type type = obj.GetType();
4 PropertyInfo[] properties = type.GetProperties(
5 BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance);
6
7 MatchEvaluator evaluator = match =>
8 {
9 string propertyName = match.Groups["Name"].Value;
10 string propertyFormat = match.Groups["Format"].Value;
11
12 PropertyInfo propertyInfo = properties.FirstOrDefault(p => p.Name == propertyName);
13 if (propertyInfo != null)
14 {
15 object propertyValue = propertyInfo.GetValue(obj, null);
16 if (string.IsNullOrEmpty(propertyFormat) == false)
17 return string.Format("{0:" + propertyFormat + "}", propertyValue);
18 else return propertyValue.ToString();
19 }
20 else return match.Value;
21 };
22 string pattern = @"\[(?<Name>[^\[\]:]+)(\s*:\s*(?<Format>[^\[\]:]+))?\]";
23 return Regex.Replace(format, pattern, evaluator, RegexOptions.Compiled);
24 }
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接