首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IFormattable的参考实现

IFormattable的参考实现
EN

Stack Overflow用户
提问于 2013-01-08 18:13:45
回答 2查看 6.7K关注 0票数 13

IFormattable有一个很好的参考实现吗?我计划至少为我的对象设置一个自定义IFormatProvider,并且我希望确保连接对于传递给IFormattable.ToString(string, IFormatProvider)的不同可能的参数集是正确的。

到目前为止我所拥有的是:

代码语言:javascript
复制
public class MyDataClass : IFormattable
{
    /// <seealso cref="IFormattable.ToString(string, IFormatProvider)"/>
    public string ToString(string format, IFormatProvider formatProvider)
    {
        ICustomFormatter formatter = (ICustomFormatter)formatProvider.GetFormat(typeof(ICustomFormatter));
        return formatter.Format(format, this, formatProvider);
    }
}

但是,似乎还有其他可能的情况应包括在内,即:

  1. 如果formatProvider为空,我是否应该返回到this.ToString()
  2. 如果formatProvider.GetFormat(typeof(ICustomFormatter))返回null,那么有什么特殊的异常应该抛出吗?

欢迎任何博客文章/代码示例/ MSDN参考。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-10 23:10:06

您似乎误解了.NET框架的格式化基础结构的设计。ICustomFormatter不应在IFormattable.ToString的实现中引用,因为这与接口的预期目的相冲突。

IFormattable

只有当一个对象知道如何设置自己的格式时,它才应该实现IFormattable (理想情况下,它应该将它委托给另一个类,但是这里会有有意的耦合)。对象可能知道如何将自己格式化为多种不同的方式,因此格式字符串允许您在它们之间进行选择。尽管如此,仍有可能存在缺失的信息,这类事情因文化而异。因此,有第二个参数间接地提供这样的信息。

传递给IFormatProvider.GetFormat的类型是特定于IFormatProvider提供给的类的类型或接口。

例如,内置的数字类型希望能够检索System.Globalization.NumberFormatInfo的实例,而与DateTime相关的类希望能够检索System.Globalization.DateTimeFormatInfo

实现IFormattable

所以让我们想象一下,我们正在创建一些新的自格式化类。如果它只知道一种设置自身格式的方法,那么它应该简单地覆盖object.ToString(),仅此而已。如果类知道有不止一种方式来格式化自己,那么就应该实现IFormattable

format参数

按照文献资料 of IFormattable.ToString,必须支持"G" (表示通用格式)的格式字符串。建议空或空格式字符串等效于"G"格式字符串。否则,确切的意义就取决于我们了。

formatProvider参数

如果我们需要任何特定于区域性的内容,或者这会发生变化,那么我们需要使用IFormatProvider参数。我们将使用IFormatProvider.GetFormat向它请求某种类型。如果IFormatProvider是空的,或者如果IFormatProvider.GetFormat返回我们想要的类型的null,我们应该返回到这个变化信息的默认源。

默认源不需要是静态的。可以想象,默认的源可能是应用程序中的用户设置,formatProvider用于预览选项更改和/或序列化所需的固定格式。

格式化还可能涉及格式化某些子对象。在这种情况下,您可能希望传递IFormatProvider。MSDN有一个实现优秀范例IFormattable,这说明了这种情况。

其他ToString过载

在实现IFormattable时,重要的是以以下方式重写Object.ToString()

代码语言:javascript
复制
public override string ToString()
{
    return this.ToString(null, System.Globalization.CultureInfo.CurrentCulture);
}

这样做可以确保somestring + yourobject等同于string.Format("{0}{1}",somestring, yourobject),您的用户将期望它是真实的。

为了方便用户,您可能应该提供string ToString(string format)。另外,如果您的默认格式有任何可以从IFormatProvider中受益的不同组件,您也可能希望提供public string ToString(IFormatProvider provider)

ICustomFormatter

所以,如果我们想格式化一个不知道如何格式化自身的类,或者我们想使用类本身不支持的某种格式,我们该怎么办?这就是ICustomFormatter变得相关的地方。可以提供ICustomFormatter类型的ICustomFormatter可以在方法(如string.FormatStringBuilder.AppendFormat )中作为IFormatProvider参数传递。

提供的ICustomFormatterstring.Format所做的每一种格式都调用了它的Format方法。如果ICustomFormatter不熟悉所使用的格式字符串,或者不支持该类型,则只需将其委托给IFormattable.ToStringObject.ToString文档提供了一个列表,如果您正在格式化尚未提供格式化支持的对象,则需要什么;如果您只想向现有的IFormattable添加额外的格式,则需要什么。它还提供了一个添加额外格式案例的示例。

参考文献

此MSDN页面提供了对.NET格式系统的一个很好的概述,并提供了指向MSDN中几乎所有其他相关页面的链接。它是几乎所有与格式化相关的问题的最佳起点。

票数 42
EN

Stack Overflow用户

发布于 2013-01-08 18:17:19

对于这样的问题,可以在单声道源代码中找到一个很好的信息源。您可能会在其mscorlib.dll代码中找到这方面的一些用途。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14221424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档