使用IFormattable接口为自定义类定义格式字符串

类别:.NET开发 点击:0 评论:0 推荐:

 /// <summary>
 /// “点”类的定义。
 /// </summary>
 public class Point : System.IFormattable
 {
  /// <summary>
  /// 点类的横纵坐标。
  /// </summary>
  private int m_x,m_y;

  /// <summary>
  /// 点类构造(参数为横纵坐标值)。
  /// </summary>
  /// <param name="x"></param>
  /// <param name="y"></param>
  public Point(int x,int y)
  {
   m_x = x;
   m_y = y;
  }

  #region IFormattable 成员

  /// <summary>
  /// 用于生成格式字符串的函数。
  /// </summary>
  /// <param name="format">格式字符串。</param>
  /// <param name="formatProvider">区域格式信息对象。</param>
  /// <returns></returns>
  public string ToString(string format, IFormatProvider formatProvider)
  {
   string retString;
   try
   {
    //判断格式字符串。
    switch(format.ToUpper())
    {
     case "G":  //自定义的通用格式。
      retString = string.Format(formatProvider,"({0},{1})",m_x,m_y);
      //“点”对象的字符串格式为:“(十进制数字,十进制数字)”。
      break;
     case "S":  //自定义的标准格式。
      retString = string.Format(formatProvider,"<{0},{1}>",m_x,m_y);
      //“点”对象的字符串格式为:“<十进制数字,十进制数字>”。
      break;
     default:  //自定义的默认格式。
      retString = string.Format(formatProvider,"({0:X},{1:X})",m_x,m_y);
      //“点”对象的字符串格式为:“(十六进制数字,十六进制数字)”。
      break;

    }
   }
   catch(System.NullReferenceException)
   {
    //格式字符串为空,返回通用格式。
    retString = string.Format(formatProvider,"({0},{1})",m_x,m_y);
   }
   return retString;
  }

  #endregion

 }

 /// <summary>
 /// Test 的摘要说明。
 /// </summary>
 public class Test
 {
  public static void Main()
  {
   //定义一个点。
   Point p = new Point(13,10);
   //打印默认格式的点。
   Console.WriteLine("{0}",p);
   //打印标准格式的点。
   Console.WriteLine("{0:S}",p);

   /*
    * 输出结果:(13,10)
    *     <13,10>
    */
  }
 }

 /*
  * 注意:如果不实现IFormattable接口也可以用string.Format这些方法打印自定义类的对象,但string.Format方法
  *    只是调用object.ToString方法将类名打印出来。下面是string.Format这些方法调用ToString的处理顺序:
  *
  *   1.如果要格式化的对象的值是 null,则返回空字符串 ("")。
  *   2.如果要格式化的对象所属的类实现了 ICustomFormatter 接口,则调用 ICustomFormatter.Format 方法。
  *   3.如果前面的ICustomFormatter.Format 方法未调用,并且该类实现了 IFormattable 接口,则调用
  *      IFormattable.ToString 方法。
  *   4.如果前面的步骤未格式化类型,则调用该类型的 ToString 方法(从 Object 类继承而来)。
  *
  * 然而,只有实现了IFormattable或ICustomFormatter这些接口才能识别我们自己定义的格式字符串,打印出我
  * 们想要的结果。
  */

本文地址:http://com.8s8s.com/it/it43462.htm