• .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

  • 相关阅读:
    Pycaret 安装问题
    关于ThreadLocal最直白的解释
    每日一题(2022524):经典搜索算法
    我使用Spring AOP实现了用户操作日志功能
    使用 CompeletedFuture 实现异步调用
    MVCC(多版本并发控制)详解
    【ACM程序设计】动态规划 第二篇 LCS&LIS问题
    服务器定时备份数据库
    mysql 慢查询
    js数组复制(浅拷贝,深拷贝)
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4798495.html
Copyright © 2020-2023  润新知