.NET基础 (13)IFormattable和IformatProvider的使用

IFormattable和IformatProvider的使用
1 如何使用IFormattable接口实现格式化输出
2 如何告诉类型格式化输出的方式

 

IFormattable和IformatProvider的使用
1 如何使用IFormattable接口实现格式化输出

对于一些类型,重写基类中的ToString方法已经能够满足需求,但对于有些类,则需要提供多种格式的输出,这时候ToString方法就不能满足需求了。此时就需要实现IFormattable中的ToString方法。

IFormattable接口帮助类型实现了多样式的格式化输出。IFormattable的ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,IFormattable.ToString方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化方法。

最典型的就是DateTime类,它就实现了IFormattable接口。

示例:

    class UseIFormattable:IFormattable
    {
        private DateTime _time;

        public UseIFormattable(DateTime time)
        {
            _time = time;
        }
        //重写ToString方法
        public override string ToString()
        {
            return "Object.ToString()";
        }
        public String ToString(String format, 
                        IFormatProvider provider)
        {
            //这一段将在后面讨论
            if (provider != null)
            {
                ICustomFormatter fmt = provider.GetFormat(
                  this.GetType())
                  as ICustomFormatter;
                if (fmt != null)
                    return fmt.Format(format, this, provider);
            }
            //这里实现格式化输出
            switch (format)
            {
                case "ld":
                    return _time.ToLongDateString();
                case "lt":
                    return _time.ToLongTimeString();
                case "sd":
                    return _time.ToShortDateString();
                case "st":
                    return _time.ToShortTimeString();
                //G 必须实现
                case "G":
                default: //nul和“”在这里实现
                    return _time.ToString();
            }
        }
        static void Main(string[] args)
        {
            UseIFormattable use = new UseIFormattable(DateTime.Now);
            Console.WriteLine(use);   //调用的是IFormattable.ToString方法
            Console.WriteLine(use.ToString("ld", null));
            Console.WriteLine(use.ToString("lt", null));
            Console.WriteLine(use.ToString("sd", null));
            Console.WriteLine(use.ToString("st", null));
            Console.Read();
        }
    }

输出:

2015/9/10 16:56:29
2015年9月10日
16:56:29
2015/9/10
16:56

2 如何告诉类型格式化输出的方式

IFormatProvider让类型的使用者有机会提供格式化的方法。GetFormat方法返回一个格式化器,通常,该格式化器的类型是一个实现了ICustomFormatter的类型对象。IFormatProvider接口和IFormattable接口一起可以实现灵活强大的格式化输出。

示例:

    class UseIFormatProvider : IFormattable
    {
        public DateTime _time;

        public UseIFormatProvider(DateTime time)
        {
            _time = time;
        }
        //重写ToString方法
        public override string ToString()
        {
            return "Object.ToString()";
        }
        public String ToString(String format,
                        IFormatProvider provider)
        {
            //这里判断使用者是否提供了格式化器
            if (provider != null)
            {
                ICustomFormatter fmt = provider.GetFormat(
                  this.GetType())
                  as ICustomFormatter;
                if (fmt != null)
                    return fmt.Format(format, this, provider);
            }
            //这里实现格式化输出
            switch (format)
            {
                case "ld":
                    return _time.ToLongDateString();
                case "lt":
                    return _time.ToLongTimeString();
                case "sd":
                    return _time.ToShortDateString();
                case "st":
                    return _time.ToShortTimeString();
                //G 必须实现
                case "G":
                default: //nul和“”在这里实现
                    return _time.ToString();
            }
        }
        static void Main(string[] args)
        {
            UseIFormatProvider use = new UseIFormatProvider(DateTime.Now);
            IFormatProvider provider = new MyProvider();
            Console.WriteLine(use);   //调用的是IFormattable.ToString方法
            //使用者提供格式化方法,格式化字符串不再起作用
            Console.WriteLine(use.ToString("lt", provider));
            Console.WriteLine(use.ToString("st", provider));
            Console.Read();
        }
    }

    //实现了IFormatProvider的类型,
    //为了方便示例,同时实现ICustomFormatter接口,其实在实际情况中,这样的做法也很常见
    class MyProvider : ICustomFormatter, IFormatProvider
    {
        //实现了ICustomFormatter的Format方法
        //实际的格式化工作在这里完成
        String ICustomFormatter.Format(string format, object arg, IFormatProvider formatProvider)
        {
            UseIFormatProvider obj = arg as UseIFormatProvider;
            if (obj == null)
                return arg.ToString();
            return obj._time.ToString("yyyy-MM-dd HH:mm:ss");
        }
        //本类型可以实现对UseIFormatProvider类型的格式化,
        //所以先判断对象的类型
        Object IFormatProvider.GetFormat(Type type)
        {
            if (type == typeof(UseIFormatProvider))
                return this;
            else
                return null;
        }
    }

输出:

2015/9/10 17:03:31
2015-09-10 17:03:31
2015-09-10 17:03:31

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

posted @ 2015-09-10 17:06  JesseLZJ  阅读(2476)  评论(0编辑  收藏  举报