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. windows mac ssh 出国访问google等系列网站

    淘宝买ssh代理 windows:tunnelier mac:issh 浏览器:chrome  插件:switchysharp

  2. GNU Radio: USRP2 and N2x0 Series

    Comparative features list 相对性能清单 Hardware Capabilities: 1 transceiver card slot External PPS referen ...

  3. 【python】常用的日期和时间操作

    #-*- coding: utf-8 -*- import datetime #给定日期向后N天的日期 def dateadd_day(days): d1 = datetime.datetime.no ...

  4. Android Studio使用JDBC远程连接mysql的注意事项(附示例)

    JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数据库写出不同的代码,但是使用JDBC必须得下载相应的驱动,比如我这里是要连接mysql,于是就到mysql官网去下载 ...

  5. 除去a标签target="_blank"的方法

    用Jquery:$(function(){$("div>a").attr("target","_blank");});先查找页面上的d ...

  6. web攻击之一:XSS跨站脚本

    一.浏览器安全 同源策略 影响源的因素:host,子域名,端口,协议 a.com通过以下代码: <script scr=http://b.com/b.js> 加载了b.com上的b.js, ...

  7. 思科、华为、H3C命令对照表

    思科 华为 H3C 描述 no undo undo 取消/关闭 当前设置 show display display 查看.显示 exit quit quit 退回上级 hostname sysname ...

  8. 【332】Machine Learning

    Reference: 决策树方法-对买电脑进行分类预测 Reference: 最邻近规则分类(K-Nearest Neighbor)KNN算法应用 Reference: python 内建函数 str ...

  9. 什么是Emit,什么是反射,二者区别到底是什么?(转)

    Emit的准确定义,我们看看微软给出的答案 System.Reflection.Emit 命名空间包含{ 允许编译器或工具发出元数据和发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘 ...

  10. linux 正则表达式

    redis-cli INFO|tr -d '\r'|egrep -v '^(#.*)?$'|sed -E 's/^([^:]*):(.*)$/redisInfo[\1]="\2"/ ...