String.Format – 它是如何工作的以及如何实现自定义格式string
通过String.Format() ,可以用许多不同的方式来格式化DateTime对象。 每当我寻找所需的格式,我需要在互联网上search。 几乎总是我find一个我可以使用的例子。 例如: 
 String.Format("{0:MM/dd/yyyy}", DateTime.Now); // "09/05/2012" 
但我不知道它是如何工作的,哪些类支持这些“魔术”附加string。
所以我的问题是:
-   String.Format如何将附加信息MM/dd/yyyy映射到string结果?
-  所有的Microsoft对象都支持这个function吗? 
 这是logging在某处吗?
-  是否有可能做这样的事情: 
 String.Format("{0:MyCustomFormat}", new MyOwnClass())
  String.Format将string( {0}等)中的每个标记与相应的对象进行匹配: http : //msdn.microsoft.com/en-us/library/system.string.format.aspx 
格式string是可选的:
 { index[,alignment][ : formatString] } 
 如果提供了formatString ,则相应的对象必须实现IFormattable ,特别是接受formatString的ToString方法,并返回相应的格式化string: http : //msdn.microsoft.com/en-us/library/system.iformattable.tostring.aspx 
 一个IFormatProvider也可以用来捕获基本的格式标准/默认值等。 这里和这里的例子。 
所以你的问题的答案依次为:
- 
它在 DateTime对象上使用IFormattable接口的ToString()方法,并传递MM/dd/yyyy格式的string。 这是返回正确的string的实现。
- 
任何实现 IFormattable对象IFormattable支持这个特性。 你甚至可以自己写!
- 
是的,看上面。 
从我的理解,你需要在你的class级实施IFormattable来支持这一点。 然后有方法,ToString将你传入的参数传入String.Format。
这是一个例子。
 // Define other methods and classes here public class Sample : IFormattable { public string ToString(string format, IFormatProvider provider) { return String.Concat("Your custom format was ", format); } } String.Format("{0:MyCustomFormat}", new Sample()) 
- 
检查官方的MSDN文档,这里有一个DateTime格式string的完整列表: http : //msdn.microsoft.com/en-us/library/az4se3k1.aspx 。 确实有不less“神奇”的string。 
- 
据我所知,并非所有types都有“有趣”的格式,但所有types都支持 ToString()。 如果你需要格式化一个内置的对象,你可以添加一个扩展方法来做到这一点,但是通常格式化是在需要的地方提供的(或者换句话说,我只为自己的types写了自定义的格式化程序) 。
- 
是的,你可以写自己的,如果你有不同的格式的数据,你可能应该通过实施IFormattable编写自定义的格式化程序,再次在这里看到的文档: http : //msdn.microsoft.com/en-us/ library / system.iformattable.aspx 。 这很简单,你只需检查提供的string,并根据这些数据写出你的数据,幕后就没有魔法了:-) 
在下面覆盖String.Format做一些如下,
 IFormattable formattable = objectToFormat as IFormattable; if (formattable != null) { formattable.ToString(objectToFormat); } else { objectToFormat.ToString(); } 
对于你的问题,
- 
String.Format如何将附加信息MM / dd / yyyy映射到string结果? 如上所述,它只是调用IFormattable .ToString(string格式,IFormatProvider提供程序)。 提供者往往是告诉你什么文化是你的系统。 通常为null,因为人们不会像你在你的情况那样通过String.Format()。 
- 
所有的微软对象都支持这个function吗? 这是logging在某处吗? 任何实现IFormattable的东西都可以。 
- 
是否有可能做这样的事情: String.Format("{0:MyCustomFormat}, new MyOwnClass())本质上,如果你想让自己的对象使用提供的格式来执行 IFormattable。
有大量的支持类和枚举器来确保这个格式string在很大程度上是相似的。 更多在这里 。
是的,这是可能的 – 它可以完全定制。 查看date和时间自定义格式的文档链接。
 如果你有自己的对象,你可以重写ToString()方法并输出任何你认为合适的表示。 一旦你这样做,你可以使用String.Format("{0:MyCustomFormat}", new MyOwnClass())因为这隐式调用MyOwnClass.ToString() 
date的文档可以在这里find: http : //msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
这应该告诉你所有的date格式字符像MM的意思。
如果要更改自定义类的string输出方式,可以重写ToString方法,如下所示:
 public class User { public string Name { get; set; } public int Age { get; set; } public override string ToString() { return this.Name + " is " + this.Age + " years old."; } } 
 然后你可以做一些像myUser.ToString()一样的东西,并得到你指定的输出。 
 并回答你的第三个问题:这是不可能的这种语法,但你可以提供IFormatProvider和ICustomFormatter实例为您没有创build一个types,或实现IFormattable在你的types(虽然,基本上扩展ToString )。