C#中ToString(string format)扩展的妙用

上传人:豆浆 文档编号:10878612 上传时间:2017-10-10 格式:DOC 页数:11 大小:119.50KB
返回 下载 相关 举报
C#中ToString(string format)扩展的妙用_第1页
第1页 / 共11页
C#中ToString(string format)扩展的妙用_第2页
第2页 / 共11页
C#中ToString(string format)扩展的妙用_第3页
第3页 / 共11页
C#中ToString(string format)扩展的妙用_第4页
第4页 / 共11页
C#中ToString(string format)扩展的妙用_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《C#中ToString(string format)扩展的妙用》由会员分享,可在线阅读,更多相关《C#中ToString(string format)扩展的妙用(11页珍藏版)》请在金锄头文库上搜索。

1、C#中 ToString(string format)扩展的妙用http:/ 13:50 鹤冲天 博客园 我要评论(0) 字号:T | T这里将介绍 C#中 ToString(string format)扩展的妙用,在.NET 中,System.Object.ToString()是用得最多的方法之一。AD: ToString(string format)扩展主要是 String类的扩展,这个扩展在很多时候都能用得到,合理重写的 ToString(string format)扩展方法中编程、调试中给我们很大方便。 在.Net 中,System.Object.ToString()是用得最多的方法之

2、一,ToString()方法在 Object类中被定义为 virtual,Object 类给了它一个默认实现:1 public virtual string ToString()2 3 return this.GetType().ToString();4 .NET中原生的 class或 struct,如 int,DateTime 等都对它进行重写(override),以让它返回更有价值的值,而不是类型的名称。合理重写的 ToString()方法中编程、调试中给我们很大方便。但终究一个类只有一个 ToString()方法,不能满足我们多样化的需求,很多类都对 ToString()进行了重载。如下

3、:1 string dateString = DateTime.Now.ToString(yyyy); /20092 string intString = 10.ToString(d4); /0010int、DateTime 都实现了 ToString(string format)方法,极大方便了我们的使用。对于我们自己定义的类型,我们也应该提供一个合理的 ToString()重写,如果能够提供再提供一个 ToString(string format),就会令我们后期的工作更加简单。试看以下类型: 1 public class People2 3 private List friends =

4、new List();4 5 public int Id get; set; 6 public string Name get; set; 7 public DateTime Brithday get; set; 8 public People Son get; set; 9 public People Friends get return friends.ToArray(); 10 11 public void AddFriend(People newFriend)12 13 if (friends.Contains(newFriend) throw new ArgumentNullExce

5、ption(newFriend, 该朋友已添加);14 else friends.Add(newFriend);15 16 public override string ToString()17 18 return string.Format(Id: 0, Name: 1, Id, Name);19 20 21 一个简单的类,我们给出一个 ToString()重写,返回包含 Id和 Name两个关键属性的字符串。现在我们需要一个 ToString(string format)重写,以满足以下应用:1 People p = new People Id = 1, Name = 鹤冲天, Brith

6、day = new DateTime(1990, 9, 9) ;2 string s0 = p.ToString(Name 生日是 Brithday); /理想输出:鹤冲天 生日是 1990-9-93 string s1 = p.ToString(编号为:Id,姓名:Name); /理想输出:编号为:1,姓名:鹤冲天想想怎么实现吧,记住 format是可变的,不定使用了什么属性,也不定进行了怎样的组合.也许一个类好办,要是我们定义很多类,几十、几百个怎么办?一一实现 ToString(string format)会把人累死的。好在我们有扩展方法,我们对 object作一扩展 ToString(

7、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

8、.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)

9、;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 35行通过反射获取了公有的、实例的 Get属性(如果需要静态的或私有的,修改第 5行中即可),78 行动态生成一个正则表达式来匹配 format,1016 行是匹配成功后的处理。这里用到反射和正则表达式,如果不熟悉

10、不要紧,先调试运行吧,测试一下前面刚提到的应用:第一个和我们理想的有点差距,就是日期上,我们应该给日期加上yyyy-MM-dd的格式,这个我们稍后改进,我们现在有一个更大的问题:如果我们想输出:“People: Id 1, Name 鹤冲天”,format 怎么写呢?写成 format=People: Id Id, Name Name,这样没法处理了,format 中两个 Id、两个 Name,哪个是常量,哪个是变量啊?解决这个问题,很多种方法,如使用转义字符,可是属性长了不好写,如format=Brithday Brithday。我权衡了一下,最后决定采用类似 Sql中对字段名的处理方法,在

11、这里就是给变量加上中括号,如下:1 People p2 = new People Id = 1, Name = 鹤冲天, Brithday = new DateTime(1990, 9, 9) ;2 string s2 = p1.ToString2(People:Id Id, Name Name, Brithday Brithday);版本二的实现代码如下:1 public static string ToString2(this object obj, string format)2 3 Type type = obj.GetType();4 PropertyInfo properties

12、= type.GetProperties(5 BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance);6 7 MatchEvaluator evaluator = match =8 9 string propertyName = match.GroupsName.Value;10 PropertyInfo property = properties.FirstOrDefault(p = p.Name = propertyName);11 if (property != null)12 13 object p

13、ropertyValue = property.GetValue(obj, null);14 if (propertyValue != null) return propertyValue.ToString();15 else return ;16 17 else return match.Value;18 ;19 return Regex.Replace(format, (?+), evaluator, RegexOptions.Compiled);20 调试执行一下:与版本一类似,不过这里没有动态构建正则表达式,因为有了中括号,很容易区分常量和变量,所以我们通过“属性名”来找“属性”(对应

14、代码中第 10行)。如果某个属性找不到,我们会将这“Name”原样返回(对就第 17行)。另一种做法是抛出异常,我不建议抛异常,在ToString(string format)是不合乎“常理”的。 版本二相对版本一效率有很大提高,主要是因为版本二只使用一个简单的正则表达式:(?+)。而版本一中的如果被扩展类的属性特别多,动态生成的正则表达式会很长,执行起来也会相对慢。我们现在来解决两个版本中都存在的时间日期格式问题,把时间日期格式yyyy-MM-dd也放入中括号中,测试代码如下:1 People p3 = new People Id = 1, Name = 鹤冲天, Brithday = new DateTime(1990, 9, 9) ;2

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号