1. 程式人生 > 其它 >C#擴充套件方法

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();

輸出: