跳到主要内容

如何使用 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 方法。你可以看到,根据格式字符串的不同,输出的字符串表示也不同。