Tip13 为类型输出格式化字符串
有两种方法为类型提供格式化的字符串输出:
1、让类型继承接口IFormattable。(需要预见类型在格式化方面的需求)
2、让类型继承接口IFormatProvider和ICustomFormatter,为类型自定义格式化器。
方法1的例子:
class Person : IFormattable
{
public string IDCode { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
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();
}
}
public override string ToString()
{
return string.Format("{0} {1}", LastName, FirstName);
}
}
Person person = new Person() { FirstName = "Jessica",
LastName = "Hu", IDCode = "NB123" };
Console.WriteLine(person);
Console.WriteLine(person.ToString("Ch", null));
Console.WriteLine(person.ToString("Eg", null));
//输出如下:
Hu Jessica
Hu Jessica
Jessica Hu
方法2的例子:
class Person
{
public string IDCode { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class PersonFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
{
return this;
}
else
{
return null;
}
}
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}", person.LastName, person.FirstName, person.IDCode);
default:
return string.Format("{0} {1}", person.FirstName, person.LastName);
}
}
Person person = new Person() { FirstName = "Jessica", LastName = "Hu", IDCode = "NB123" };
Console.WriteLine(person.ToString());
PersonFormatter pFormatter = new PersonFormatter();
Console.WriteLine(pFormatter.Format("Ch", person,null));
Console.WriteLine(pFormatter.Format("Eg", person, null));
Console.WriteLine(pFormatter.Format("ChM",person,null));
//输出:
ConsoleApplication1.Person
Hu Jessica
Jessica Hu
Hu Jessica
其实可以在方法1的ToString方法稍作修改,让格式化输出在语法上支持更多的调用方式:
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));