建议13: 为类型输出格式化字符串
针对Person的格式化器的实现为:
- class PersonFomatter : IFormatProvider, ICustomFormatter
- {
- #region IFormatProvider 成员
- public object GetFormat(Type formatType)
- {
- if (formatType == typeof(ICustomFormatter))
- return this;
- else
- return null;
- }
- #endregion
- #region ICustomFormatter 成员
- public string Format(string format, object arg,
- IFormatProvider formatProvider)
- {
- Person person = arg as Person;
- if (person == null)
- {
- return string.Empty;
- }
- switch (format)
- {
- case "Ch":
- return string.Format("{0} {1}", person.LastName,
- person.FirstName);
- case "Eg":
- return string.Format("{0} {1}", person.FirstName,
- person.LastName);
- case "ChM":
- return string.Format("{0} {1} : {2}", person.LastName,
- person.FirstName, person.IDCode);
- default:
- return string.Format("{0} {1}", person.FirstName,
- person.LastName);
- }
- }
- #endregion
实际上,在第一个版本的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",
- //第二类格式化输出语法,更简洁
- Console.WriteLine(person.ToString("Ch", pFormatter));
- Console.WriteLine(person.ToString("Eg", pFormatter));
- Console.WriteLine(person.ToString("ChM", pFormatter));