Loading

C#扩展方法

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

C#扩展方法第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
扩展方法的目的就是为一个现有类型添加一个方法,现有类型既可以是int,string等数据类型,也可以是自定义的数据类型。例如为数据类型的添加一个方法的理解:一般来说,int数据类型有个Tostring的方法,就是把int 数据转换为字符串的类型,比如现在我们想在转换成字符串的时候还添加一点东西,比如增加一个字符 a .那么之前的Tostring就不好使了,因为它只是它我们的int数据转换为string类型的,却并不能添加一个字母 a.所以这就要用到所谓的扩展方法了。首先我们看一个给现有的类型增加一个扩展方法。我们想给string 类型增加一个Add方法,该方法的作用是给字符串增加一个字母a.

示例1:

static void Main(string[] args)
        {
            string str = "AoMan";
            //Tips:必须使用对象来调用
            string newStr = str.Add();
            Console.WriteLine($"str:{str}--newStr:{newStr}");

            Console.ReadKey();
        }


        /* 声明扩展方法
         * 扩展方法必须是静态的
         * this必须有,string表示我要扩展的类型,strVal表示对象名
         * 3个参数this和扩展的类型必不可少,对象名可以自己随意取
         * 如果需要传递参数,再增加一个变量即可
         */
        public static string Add(this string strVal) {
            return strVal + "YuPianjian";
        }

示例2:

再尝试给自定义的类型增加两个扩展方法

1、定义一个Student实体

public class Student
    {
        public string StudentName { get; set; }
        public string StuId { get; set; }
    }

2、定义扩展方法

public static class StudentExtension
    {
        //不带参数的自定义类型扩展方法
        public static string StuInfo(this Student student)
        {
            return $"学生姓名:{student.StudentName}\r\n学生学号:{student.StuId}";
        }

        //带参数的自定义类型扩展方法
        public static string StuInfoToJson(this Student student, string stuName, string stuId)
        {
            return $"{{\"StudentName\":\"{stuName}\",\"StuId\":\"{stuId}\"}}";
        }
    }

Tips:按照惯例扩展方法类最好以Extension结尾

3、调用扩展方法

Student student = new Student
            {
                StudentName = "张三",
                StuId = "1704030434"
            };
            Console.WriteLine(student.StuInfo());

            Console.WriteLine(student.StuInfoToJson(student.StudentName,student.StuId));

            Console.ReadKey();

输出:

image-20210824215547032

posted @ 2021-08-24 22:07  傲慢与偏见luc  阅读(298)  评论(0编辑  收藏  举报