• 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"));
                }
            }
        }
    复制代码

        输出结果:

        

     
     
    分类: .NETC#
  • 相关阅读:
    Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
    android intent和intent action大全
    手机信息
    Android 获取信号强度
    android 基站定位
    Android 读取SIM卡参数
    Android 获取手机SIM资料详解
    Android手机中获取手机号码和运营商信息
    java中的url 编码与解码
    java.util.Scanner的日常用法
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3031983.html
Copyright © 2020-2023  润新知