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. 【c#】设置Socket连接、接收超时(转)

    用到Socket,发现如果连接错误,比如Connect的端口不对,会造成很长时间的延时,程序就僵在那里,效果很不好: 在网上找到很方便的设置办法,分享如下: Socket.SetSocketOptio ...

  2. centOS6.6环境下安装AMP

    LAMP --  Linux Apache MySQL PHP 在CentOS安装的顺序,我一般是Apache -> MySQL -> PHP 第一步.安装并配置Apache 1.使用yu ...

  3. PhoneGap 获得APP的VersionName

    1.首先安装cordova-plugin-app-version cordova plugin add cordova-plugin-app-version 2. 调用方法如下 function ge ...

  4. 在vc++上简单搭建环境(包括文件引用)

    1,triplet_head.h 文件 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVER_FLOW -2 ...

  5. C BIN加密

    #include <stdio.h> #include <string.h> #include <stdlib.h> #ifndef DWORD #define D ...

  6. emacs里面模拟vim按键操作的插件evil

    emacsConfig/evil-setting.el (setq evil-mode t) (setq evil-shift-width ) ;; some modes aren't meant f ...

  7. 精《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #5 使用checkpatch.pl检查补丁的格式

    HACK #5 使用checkpatch.pl检查补丁的格式 本节介绍发布前检查补丁格式的方法.Linux内核是由多个开发者进行开发的.因此,为了保持补丁评估与源代码的可读性,按照统一的规则进行编写是 ...

  8. 新建网站与新建Asp.Net Web 应用程序的区别

    .net网站和应用程序区别,网站是动态执行的不用编译,他只依赖于自己的文档本身,甚至你用aspx里直接写jsp代码都可以,其实网站可以说只是在.net平台中打开的文档,相当于最初的记事本编码,他并不需 ...

  9. 分布式锁实践(一)-Redis编程实现总结

    写在最前面 我在之前总结幂等性的时候,写过一种分布式锁的实现,可惜当时没有真正应用过,着实的心虚啊.正好这段时间对这部分实践了一下,也算是对之前填坑了. 分布式锁按照网上的结论,大致分为三种:1.数据 ...

  10. python twilio 短信群发 知识留存

    1. win7 32位系统,傻瓜安装Anaconda2(python 2.7) 2. 打开cmd, 输入命令pip install twilio,在线安装twilio 3. 打开Anaconda2的S ...