C#基础:通过一个实例来学习IFormattable接口,扩展方法
2013-04-19 18:30
671 查看
本实例中,定义了类型Student。Racer定义了几个属性和一个重载的ToString()方法,该方法以字符串格式显示学生信息。这个类实现了IFormattable接口,以支持格式字符串的不同变体。
Student类声明如下:
扩展方法可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个特定接口的任何类中,这样多个类就可以使用相同的实现代码。
例如,String类是密封的,所以我们不能继承这个类,我们可以通过扩展给String类添加方法tostring(),如下所示
如上面的代码所示,扩展方法在静态类中声明,定义为一个静态方法,其中第一个参数定义了它扩展的类型。tostring()方法扩展了String类,因为它的第一个参数定义为String类型。为了区分扩展方法和一般的静态方法,扩展方法还需要对第一个参数使用this关键字。
下面就可以使用String类型的扩展方法tostring()了,如下所示:
结果在控制台显示的信息是:Extension output: Hello World!
下面看看本实例中,获取学生信息GetInfomation这个类的定义
最后,主函数调用这些方法的实例如下所示:
输出结果:
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")); } } }
输出结果:
相关文章推荐
- C#基础:通过一个实例来学习IFormattable接口,扩展方法
- 扩展方法的几个实例,扩展基本类型、接口、通过反射让扩展方法使用私有成员等
- .Net学习笔记----2015-07-22(C#基础复习09,虚方法、抽象方法、接口复习)
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- C#抽象方法与抽象实例--C#基础
- 抽象类与接口--由一个调用接口方法的小实例所想到的
- 学习.NET (8) 实现派生类中Deep Copy的几种常用方法(通过ICloneable接口)
- php实例化一个对象时通过构造方法传参
- Java反射之通过反射获取一个对象的方法信息(实例代码)
- Vue2.0基础学习(3)--- 一个简单的实例学习
- 亚马逊AWS学习——多网络接口下配置EC2实例连接公网的一个“bug”
- SVM实现多分类的程序基础工作(二)——通过一个简单libsvm例子迈入libsvm学习的大门
- 实例 C#3.0与C#2.0相比之新特性(二)---扩展方法
- 亚马逊AWS学习——多网络接口下配置EC2实例连接公网的一个“bug”
- 本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView
- 编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系。在
- C#中只运行一个实例的方法
- 一个利用扩展方法的实例:AttachDataExtensions
- c#扩展方法奇思妙用基础篇五:Dictionary<TKey, TValue> 扩展
- [技巧] C#实现让程序只能打开一个实例(总结3方法)