建议13: 为类型输出格式化字符串(2)
一个典型的格式化器应该继承接口IFormatProvider和ICustomFomatter,所以应该像下面这样调用格式化器:
- Person person = new Person() { FirstName = "Jessica", LastName = "Hu",
- IDCode = "NB123" };
- Console.WriteLine(person.ToString());
- PersonFomatter pFormatter = new PersonFomatter();
- Console.WriteLine(pFormatter.Format("Ch", person, null));
- Console.WriteLine(pFormatter.Format("Eg", person, null));
- Console.WriteLine(pFormatter.Format("ChM", person, null));
输出为:
- ConsoleApplication4.Person
- Hu Jessica
- Jessica Hu
- Hu Jessica : NB123
本示例也演示了如果没有重写Object.ToString方法,类型会输出类型名称。
实际上,在第一个版本的Person类型中,如果对IFormattable的ToString方法稍作修改,就能让格式化输出在语法上支持更多的调用方式。注意看Person类型的最终版本中ToString方法的switch结构的default部分,如下所示。
- class Person : IFormattable
- {
- public string IDCode { get; set; }
- public string FirstName { get; set; }
- public string LastName { get; set; }
- //实现接口IFormattable的方法ToString
- public string ToString(string format, IFormatProvider formatProvider)
- {
- switch (format)
- {
- case "Ch":
- return this.ToString();
- case "Eg":
- return string.Format("{0} {1}", FirstName, LastName);
- default:
- //return this.ToString();
- ICustomFormatter customFormatter = formatProvider
- as ICustomFormatter;
- if (customFormatter == null)
- {
- return this.ToString();
- }
- return customFormatter.Format(format, this, null);
- }
- }
- //重写Object.ToString()
- public override string ToString()
- {
- return string.Format("{0} {1}", LastName, FirstName);
- }
- }
最终,调用者的代码能够支持如下所示的语法:
- Person person = new Person() { FirstName = "Jessica", LastName = "Hu",
- IDCode = "NB123" };
- Console.WriteLine(person.ToString());
- PersonFomatter pFormatter = new PersonFomatter();
- //第一类格式化输出语法
- Console.WriteLine(pFormatter.Format("Ch", person, null));
- Console.WriteLine(pFormatter.Format("Eg", person, null));
- Console.WriteLine(pFormatter.Format("ChM", person, null));
- //第二类格式化输出语法,更简洁
- Console.WriteLine(person.ToString("Ch", pFormatter));
- Console.WriteLine(person.ToString("Eg", pFormatter));
- Console.WriteLine(person.ToString("ChM", pFormatter));
转自:《编写高质量代码改善C#程序的157个建议》陆敏技