.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
转载请注明出处: