c#扩展方法奇思妙用高级篇五:ToString(string format) 扩展
2010-09-30 20:52:19 来源:WEB开发网一个简单的类,我们给出一个ToString()重写,返回包含Id和Name两个关键属性的字符串。现在我们需要一个ToString(string format)重写,以满足以下应用:
1 People p = new People { Id = 1, Name = "鹤冲天", Brithday = new DateTime(1990, 9, 9) };
2 string s0 = p.ToString("Name 生日是 Brithday"); //理想输出:鹤冲天 生日是 1990-9-9
3 string s1 = p.ToString("编号为:Id,姓名:Name"); //理想输出:编号为:1,姓名:鹤冲天
想想怎么实现吧,记住format是可变的,不定使用了什么属性,也不定进行了怎样的组合...
也许一个类好办,要是我们定义很多类,几十、几百个怎么办?一一实现ToString(string format)会把人累死的。好在我们有扩展方法,我们对object作一扩展ToString(string format),.Net中object是所有的基类,对它扩展后所有的类都会自动拥有了。当然已有ToString(string format)实现的不会,因为原生方法的优先级高,不会被扩展方法覆盖掉。
来看如何实现吧(我们会一步一步改进,为区分各个版本,分别扩展为ToString1、ToString2...分别对应版本一、版本二...):
1 public static string ToString1(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 string[] names = properties.Select(p => p.Name).ToArray();
8 string pattern = string.Join("|", names);
9
10 MatchEvaluator evaluator = match =>
11 {
12 PropertyInfo property = properties.First(p => p.Name == match.Value);
13 object propertyValue = property.GetValue(obj, null);
14 if (propertyValue != null) return propertyValue.ToString();
15 else return "";
16 };
17 return Regex.Replace(format, pattern, evaluator);
18 }
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接