格式字符串不限于内置类型,可以为自己的类型创建自定义格式字符串。为此,只需要实现接口 IFormattable。
首先是一个简单的 Person 类,它包含 FirstName 和 LastName 属性(代码文件StringFormats/Person.cs):
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
”
为了获得这个类的简单字符串表示,重写基类的 ToString 方法。这个方法返回由 FirstName 和 LastName 组成的字符串:
public override string ToString() => FirstName+""+ LastName;
除了简单的字符串表示之外,Person 类也应该支持格式字符串 F,返回名 L 和姓A,后者代表 “ all ” ;并且应该提供与 ToString 方法相同的字符串表示。为实现自定义字符串,接口 IFormattable 定义了带两个参数的 ToString 方法:一个是格式的字符串参数,另一个是 IFormatProvider 参数。IFormatProvider 参数未在示例代码中使用。可以基于区域值使用这个参数,进行不同的显示,因为 CultureInfo 类实现了该接口。
实现了这个接口的其他类是 NumberFormatInfo 和 DateTimeFormatInfo。可以把实例传递到 ToString 方法的第二个参数,使用这些类配置数字和 DateTime 的字符串表示. ToString 方法的实现代码只使用 switch 语句,基于格式字符串返回不同的字符串。为了使用格式字符串直接调用 ToString方法,而不提供格式提供程序,应重载 ToString 方法。这个方法又调用有两个参数的 ToString 方法:
public class Person : IFormattable
{
public string FirstName { get; set; )
public string LastName { get; set; }
public override string ToString() => FirstName + ""+ LastName;
public virtual string ToString(string format) => ToString(format, null);
public string ToString(string format, IFormatProvider formatProvider)
{
switch (format)
{
case null:
case "A":
return ToString();
case "F":
return FirstName;
case "L":
return LastName;
default:
throw new FormatException($"invalid format string {format}");
}
}
}
有了这些代码,就可以显式传递格式字符串,或隐式使用字符串插值,以调用ToString 方法。隐式的调用使用带两个参数的 ToString 方法 ,并给IFormatProvider 参数传递 null :
var p1 = new Person { FirstName = "Stephanie", LastName = "Nagel" };
Console.WriteLine(p1.ToString("F"));
Console.WriteLine($"(p1:F}");
技术群: 需要进技术群学习交流的请添加小编微信,切记备注:加群,对以上内容有什么疑问也可以直接和小编直接沟通交流!
小编微信:mm1552923
公众号:dotNet编程大全
往期推荐
Love life,love yourself
关注小编不迷路呦~