如何使用 IFormattable 接口实现格式化输出 ?
参考答案:
IFormattable
是 C# 中的一个接口,它定义了一个 ToString
方法,该方法接受一个 IFormatProvider
和一个 string
格式的参数。你可以通过实现这个接口,在你的类中自定义对象的字符串表示形式,并且可以根据指定的格式和区域设置信息来格式化这个字符串。
以下是一个简单的例子,它展示了如何为一个简单的类实现 IFormattable
接口:
using System;
using System.Globalization;
public class Person : IFormattable
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public string ToString(string format, IFormatProvider formatProvider)
{
if (formatProvider != null)
{
CultureInfo ci = formatProvider as CultureInfo;
if (ci != null)
{
// 这里可以根据 CultureInfo 对象来调整格式
}
}
if (string.IsNullOrEmpty(format))
{
// 如果没有指定格式,返回一个默认的字符串表示
return $"Name: {Name}, Age: {Age}";
}
else if (format == "F")
{
// 如果指定了 "F" 格式,返回一个包含全名和年龄的字符串
return $"Full Name: {Name}, Age: {Age}";
}
else if (format == "S")
{
// 如果指定了 "S" 格式,只返回名字
return Name;
}
else
{
// 如果格式未知,抛出一个异常或返回一个默认的字符串
throw new FormatException(string.Format("The format string '{0}' is not supported.", format));
}
}
}
在这个例子中,Person
类实现了 IFormattable
接口,并重写了 ToString
方法。这个方法接受一个格式字符串和一个 IFormatProvider
对象。格式字符串用于指定如何格式化对象,而 IFormatProvider
对象则用于提供区域设置信息。
然后,你可以像下面这样使用这个类:
Person person = new Person("John Doe", 30);
Console.WriteLine(person.ToString()); // 输出: Name: John Doe, Age: 30
Console.WriteLine(person.ToString("F")); // 输出: Full Name: John Doe, Age: 30
Console.WriteLine(person.ToString("S")); // 输出: John Doe
Console.WriteLine(person.ToString("Unknown")); // 抛出 FormatException
在这个例子中,我们创建了一个 Person
对象,并使用不同的格式字符串来调用其 ToString
方法。你可以看到,根据格式字符串的不同,输出的字符串表示也不同。