【发布时间】:2018-05-18 00:18:25
【问题描述】:
我有一个IFormatProvider,它会注销它传递的类型:
internal class LoggingFormatProvider : IFormatProvider
{
public object GetFormat(Type formatType)
{
WriteLine($" formatType: {formatType.FullName}");
return null;
}
}
当我用这段代码调用它时:
var myLoggingProvider = new LoggingFormatProvider();
string.Format(myLoggingProvider, "123: {0}", 123);
它输出两个对GetFormat方法的调用:
formatType: System.ICustomFormatter
formatType: System.Globalization.NumberFormatInfo
为什么会有两个调用?
当涉及到格式化类型时,我通常对什么叫做什么和什么感到非常困惑。
【问题讨论】:
-
您缺少一个步骤,您还需要提供 ICustomFormatter 的实现,其 Format() 方法可以完成实际工作。它要求你提供它,但你决定不给它。所以它一直在寻找,回到标准提供者。我猜您也希望您的 LoggingFormatProvider 类实现 ICustomFormatter。然后,您只需从 GetFormat() 中返回 this。
-
@HansPassant 返回
null是否意味着使用默认值重试? -
大概,是的。当您表示要提供自定义格式化程序时,返回 null 并没有多大意义。但是,如果您出于某种原因不希望它是自定义的,那么您可以同意标准格式化程序。
-
@HansPassant
123.ToString(myLoggingProvider)只打一个电话(NumberFormatInfo)很奇怪吗?