我有一个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
为什么有两个电话?
对于格式化类型的内容,我通常会对什么叫做什么感到困惑。
答案 0 :(得分:2)
当您调用string.Format(myLoggingProvider, "123: {0}", 123)
时,.NET首先会询问您的LoggingFormatProvider
实例是否可以提供自定义格式化程序(即ICustomFormatter
的实例)。由于它不能(您返回null
),并且要格式化的值是一个数字,因此它会回退到请求NumberFormatInfo的实例。
如果您的参数是DateTime
的实例,则会收到DateTimeFormatInfo实例的请求。数字和日期显然是唯一可以获得此类后备的参数类型,正如the documentation for IFormatProvider似乎暗示的那样。