好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#基础:通过一个实例来学习IFormattable接口,扩展方法

C#基础:通过一个实例来学习IFormattable接口,扩展方法

C#基础:通过一个实例来学习IFormattable接口,扩展方法

本实例中,定义了类型Student。Racer定义了几个属性和一个重载的ToString()方法,该方法以字符串格式显示学生信息。这个类实现了IFormattable接口,以支持格式字符串的不同变体。

    Student类声明如下:

     class   Student:IFormattable
    {
          public   string  Name {  get ;  set ; } //  姓名 
         public   string  Age {  get ;  set ; } //  年龄 
         public   string  Address {  get ;  set ; } //  地址 
         public   string  StuNum {  get ;  set ; } //  学号 
         ///   <summary> 
         ///   People构造函数,给学生实体赋值
          ///   </summary> 
         public  Student( string  name,  string  age,  string  address,  string   stuNum)
        {
              this .Name =  name;
              this .Age =  age;
              this .Address =  address;
              this .StuNum =  stuNum;
        }
          ///   <summary> 
         ///   实现IFormattable接口,格式化输出学生信息
          ///   </summary> 
         public   string  ToString( string   format, IFormatProvider formatProvider)
        {
              switch   (format)
            {
                  //  只输出姓名 
                 case   "  N  " :  return   "  姓名  " + Name;
                  //  输出学生全部信息 
                 case   "  F  " :  return  String.Format( "  姓名:{0}  年龄:{1}  学号:{2}  地址:{3}  "  , Name, Age, StuNum, Address);
                  //  信息格式化失败,抛出异常 
                 default :  throw   new  FormatException( "  信息格式化失败  "  );
            }
        }
          //  重载ToString方法,化简格式化输出的传入参数 
         public   string  ToString( string   format)
        {
              return  ToString(format,  null  );
        }
    } 

    扩展方法可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个特定接口的任何类中,这样多个类就可以使用相同的实现代码。

    例如,String类是密封的,所以我们不能继承这个类,我们可以通过扩展给String类添加方法tostring(),如下所示

 public   static   class   StringExtension
{
      public   static   void  tostring( this   string   s)
    {
           Console.WriteLine(  "  Extension output: {0}  "  ,s);
    }
} 

    如上面的代码所示,扩展方法在静态类中声明,定义为一个静态方法,其中第一个参数定义了它扩展的类型。tostring()方法扩展了String类,因为它的第一个参数定义为String类型。为了区分扩展方法和一般的静态方法,扩展方法还需要对第一个参数使用this关键字。

    下面就可以使用String类型的扩展方法tostring()了,如下所示:

 string  s= "  Hello World!   "  ;
s.tostring(); 

    结果在控制台显示的信息是:Extension output: Hello World!

    下面看看本实例中,获取学生信息GetInfomation这个类的定义

     static   class   GetInfomation
    {
          //  初始化一个学生信息列表 
         public   static  List<Student>  stu;
          ///   <summary> 
         ///   给学生列表赋值
          ///   </summary> 
         ///   <returns></returns> 
         public   static  IList<Student>  getStudent()
        {
              if  (stu ==  null  )
            {
                stu  =  new  List<Student> ();
                stu.Add(  new  Student( "  小吕  " ,  "  23  " ,  "  中国成都  " ,  "  2940610410  "  ));
                stu.Add(  new  Student( "  小方  " ,  "  24  " ,  "  中国浙江  " ,  "  2940610411  "  ));
                stu.Add(  new  Student( "  小范  " ,  "  22  " ,  "  中国成都  " ,  "  2940610412  "  ));
                stu.Add(  new  Student( "  小龚  " ,  "  23  " ,  "  中国遵义  " ,  "  2940610413  "  ));
                stu.Add(  new  Student( "  小秦  " ,  "  24  " ,  "  中国成都  " ,  "  2940610624  "  ));
            }
              return   stu;
        }
          ///   <summary> 
         ///  扩展方法,返回地址在成都的同学
          ///   </summary> 
         ///   <param name="P"></param> 
         ///   <returns></returns> 
         public   static  IEnumerable<Student> chengduStudent( this  IList<Student>  P)
        {
              //  Linq查询,获取P列表中在成都的同学的信息 
             var  query = P.Where(p => p.Address ==  "  中国成都  " ).OrderByDescending(p => p.StuNum).Select(p =>  p);
              return   query;
        }
          ///   <summary> 
         ///   扩展方法,返回年龄为23的同学
          ///   </summary> 
         ///   <param name="P"></param> 
         ///   <returns></returns> 
         public   static  IEnumerable<Student> ageStident( this  IList<Student>  P)
        {
              var  query = P.Where(p => p.Age ==  "  23  " ).OrderByDescending(p => p.StuNum).Select(p =>  p);
              return   query;
        }
    } 

    最后,主函数调用这些方法的实例如下所示:

     class   Program
    {
          static   void  Main( string  [] args)
        {
              //  获取学生信息列表 
             var  Result =  GetInfomation.getStudent();
              //  调用Linq查询扩展方法获取在成都的学生列表 
            IEnumerable<Student> chengdu_stu= Result.chengduStudent();
            Console.WriteLine(  "  地址在成都的学生信息列表:  "  );
              foreach  (Student p  in   chengdu_stu)
            {
                Console.WriteLine(p.ToString(  "  F  "  ));
            }
            Console.WriteLine(  "  --------------------------------------------  "  );
            Console.WriteLine(  "  年龄为23岁的学生信息列表:  "  );
              //  调用扩展方法获取年龄等于23的学生信息 
            IEnumerable<Student> age_stu =  Result.ageStident();
              foreach  (Student s  in   age_stu)
            {
                Console.WriteLine(s.ToString(  "  F  "  ));
            }
        }
    } 

    输出结果:

    

 

 

分类:  .NET ,  C#

标签:  .NET ,  C#基础 ,  IFormattable接口 ,  扩展方法

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C#基础:通过一个实例来学习IFormattable接口,扩展方法的详细内容...

  阅读:36次