c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展
2010-09-30 20:52:19 来源:WEB开发网 1 public static string ToString5(this object obj, string format)
2 {
3 MatchEvaluator evaluator = match =>
4 {
5 string[] propertyNames = match.Groups["Name"].Value.Split('.');
6 string propertyFormat = match.Groups["Format"].Value;
7
8 object propertyValue = obj;
9
10 try
11 {
12 foreach (string propertyName in propertyNames)
13 propertyValue = propertyValue.GetPropertyValue(propertyName);
14 }
15 catch
16 {
17 return match.Value;
18 }
19
20 if (string.IsNullOrEmpty(propertyFormat) == false)
21 {
22 if (propertyFormat.StartsWith("."))
23 {
24 string subPropertyName = propertyFormat.Substring(1);
25 IEnumerable<object> objs = ((IEnumerable)propertyValue).Cast<object>();
26 if (subPropertyName == "Count")
27 return objs.Count().ToString();
28 else
29 {
30 string[] subProperties = objs.Select(
31 o => o.GetPropertyValue(subPropertyName).ToString()).ToArray();
32 return string.Join(", ", subProperties);
33 }
34 }
35 else
36 return string.Format("{0:" + propertyFormat + "}", propertyValue);
37 }
38 else return propertyValue.ToString();
39 };
40 string pattern = @"\[(?<Name>[^\[\]:]+)(\s*[:]\s*(?<Format>[^\[\]:]+))?\]";
41 return Regex.Replace(format, pattern, evaluator, RegexOptions.Compiled);
42 }
执行结果:
比较不可思议吧,下面简单分析一下。行22~行33是对集合进行操作的相关处理,这里只是简单实现了Count,当然也可以实现Min、Max、Sum、Average等等。“.Name”这个表示方法不太好,这里主要是为了展示,大家能明白了就好。
就写到这里吧,版本六、版本七...后面还很多,当然一个比一个离奇,不再写了。给出五个版本,版本一存在问题,主要看后三个版本,给出多个版本是为满足不同朋友的需要,一般来说版本三足够,对于要求比较高,追求新技术的朋友,我推荐版本四、五。要求更高的,就是没给出的六、七...了。
ToString(string format)扩展带来便利性的同时,也会带来相应的性能损失,两者很难兼得。
最后重申下,本系列文章,侧重想法,所给的代码仅供演示、参考,没有考虑性能、异常处理等,如需实际使用,请自行完善。
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接