大家好,欢迎来到IT知识分享网。
前言
对于某些类的对象,我们需要格式化输出,一般重写ToString()方法就足够了。但也有一些类的对象,需要提供多种多样的格式化输出,最典型的就是DateTime类,它的ToString()方法可以接受不同参数进行格式化输出,如下图所示。
三个接口的区别
1、IFormatProvider(格式化器提供者)
IFormatProvider接口中只有一个方法GetFormat,它的主要作用是:对需要格式化对象的类型进行判断,并提供相应的格式化器。为什么会有格式化器呢?因为假如一个ToString()方法的内部格式化形式不是我们想要的,我们就可以自己提供一个格式化器给ToString()方法,让它格式化成我们想要的形式。所以IFormatProvider类的含义就是 格式化器的提供者。
ICustomFormatter(格式化器)
一般而言,格式化器是需要实现ICustomFormatter接口的,该接口也只包含一个接受三个参数的方法,其中第二个参数arg是被格式化对象,而第一个参数format是可以指定arg被格式化成什么样子的标识符,第三个参数formatProvider是格式化器提供者,暗指可以在指定一个格式化器。该方法的返回值就是一个格式化好的字符串对象。
3、IFormattable(可格式化对象)
不言而喻,实现IFormattable接口的对象就表明它可以利用格式化器进行格式化。该接口也只提供一个接受两个参数ToString()方法。第一个参数format是可以指定当前对象被格式化成什么样子的标识符,第二个参数formatProvider是格式化器提供者。
代码分析
讲明白三个接口之间的关系,我们直接看代码!
//格式化器类 //一般而言,格式化器类不仅需要实现ICustomFormatter接口,也要实现IFormatProvider接口 //为什么?微软案例就这样写的,按我理解 GetFormat的目的不就是 判断对象类型并返回格式化器 //我MyFormater自己判断类型,自己返回自己,怎么啦!怎么啦!你有什么问题吗? public class MyFormater:ICustomFormatter,IFormatProvider {
public object GetFormat(Type format) {
//判断format类型,如果是FormattableObject类,并返回相应格式化器 if (format == typeof(FormattableObject)) return this; return null; } public string Format(string format, object arg, IFormatProvider provider) {
//如果格式化标识符为null if (format == null) {
//如果arg是实现IFormattable的对象 if (arg is IFormattable) return ((IFormattable)arg).ToString(format, provider); return arg.ToString(); } else {
if (format == "MyFormater") {
return "" + arg.ToString(); } else {
if (arg is IFormattable) return ((IFormattable)arg).ToString(format, provider); return arg.ToString(); } } } } public class FormattableObject : IFormattable {
public string ToString(string format, IFormatProvider formatProvider) {
//TODO 写代码进行格式化输出(懒得自己编了) } }
完结撒花!!!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/142168.html