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

.NET基础 (13)IFormattable和IformatProvider的使用的更多相关文章

  1. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  2. 十三. Python基础(13)--生成器进阶

    十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...

  3. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  4. IFormattable,ICustomFormatter, IFormatProvider接口

    定                 义 1.IFormattable   提供一种功能,用以将对象的值格式化为字符串表示形式. 2.IFormatProvider  提供用于检索控制格式化的对象的机制 ...

  5. OC基础13:数字、字符串和集合2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...

  6. Java基础13:反射详解

    本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...

  7. 『Python基础-13』函数 Function

    这篇笔记记录的知识点: 函数的基本概念 自定义函数 函数的几种参数 编程的三种方式: 1.OOP 面向对象编程,万物皆对象,以class为主,抽象化 2.POP 面向过程编程,万事皆过程,def定义过 ...

  8. javaweb基础(13)_session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  9. 【java基础 13】两种方法判断hashmap中是否形成环形链表

    导读:额,我介绍的这两种方法,有点蠢啊,小打小闹的那种,后来我查了查资料,别人都起了好高大上的名字,不过,本篇博客,我还是用何下下的风格来写.两种方法,一种是丢手绢法,另外一种,是迷路法. 这两种方法 ...

随机推荐

  1. VS2017 Linux C++引用自定义的动态库

    前一篇博客讲了用系统库libpthread.so的例子,只需要在项目属性页的[C++->命令行参数]和[链接器->命令行参数]中加上对应参数(比如-pthread)即可,然后我试着引用自己 ...

  2. NPOI-Excel系列-1002.创建带有Document Summary Information和Summary Information的Excel文件

    1. using NPOI.HSSF.UserModel; using NPOI.HPSF; using NPOI.POIFS.FileSystem; using Microsoft.VisualSt ...

  3. (转)为C# Windows服务添加安装程序

    本文转载自:http://kamiff.iteye.com/blog/507129 最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻 ...

  4. scrollWidth,clientWidth,offsetWidth的区别 ---转载的

    转载自博客:http://www.cnblogs.com/kongxianghai/p/4192032.html 通过一个demo测试这三个属性的差别. 说明: scrollWidth:对象的实际内容 ...

  5. [转][javascript]判断传入参数

    // IE 下 name 都是 undefined ,这里手动赋值 Number.name="Number"; //String.name="String"; ...

  6. win和linux下控制台界面中停顿X秒的方式

    win localhost > nul linux

  7. Spring IO Platform介绍

    为什么要用Spring IO Platform 今天无意间看到了一个关键词:"Spring IO Platform",第一直觉是不是有关于IO方面的框架或者包呢,查了一下,居然是为 ...

  8. LDAP属性对照表

    AD属性对照表 姓 Sn 名 Givename 英文缩写 Initials 显示名称 displayName 描述 Description 办公室 physicalDeliveryOfficeName ...

  9. 创建django的8大步骤xxx.setAttribute('name', 'user'); 添加属性和值 xxx.attr('name') 查看属性的值 $(xxx).addClass 添加样式 $().after() 添加在标签后面

    第一步.创建django 方法一:django-admin startproject 方法二: 直接在python上创建 第二步:创建工程名cmdb python manage.py startapp ...

  10. //todo 的用处

    在代码中添加 //todo 以后要做的事 可以暂时打上标记,以后再来处理. 光有这个没什么用,关键是IDE要支持,比如VS2017,只要按下 ctrl+w,t 就可以在输出窗口中显示出所有 todo的 ...