C# 擴展方法


擴展方法 使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。

當我們vs中編寫代碼使用Linq 的時候,經常會看到智能提示出現帶如下符號的方法:

這就是擴展方法。

如何定義自己的擴展方法呢?MSDN給出了詳細的解釋(具體可以參閱 實現和調用自定義擴展方法):

1、定義一個靜態類以包含擴展方法。該類必須對客戶端代碼可見。 
2、將該擴展方法實現為靜態方法,並使其至少具有與包含類相同的可見性。
3、該方法的第一個參數指定方法所操作的類型;該參數必須以 this 修飾符開頭。
4、在調用代碼中,添加一條 using 指令以指定包含擴展方法類的命名空間。
5、按照與調用類型上的實例方法一樣的方式調用擴展方法。

下面來舉兩個小例子來說明一下擴展方法的定義和調用:

1、首先看一個最簡單的,來為String 類 定義一個擴展方法: 

 public static class MehtondExtension
    {
        public static string tostring(this string s)
        {
           return (string.Format("Extension output: {0}", s));
        }
    }

注意 類的定義和方法的定義都有static 修飾,方法的第一個參數有 this 修飾符 

在Main函數中進行調用:

class Program
    {
        static void Main(string[] args)
        {
            string s = "Hello World";
            Console.WriteLine(s.ExToString());
            Console.ReadKey();
        }
    }

 結果輸出 :Extension output: Hello World 

2、來個略微復雜一點的,我們為一個集合添加一個查詢的擴展方法,當然用linq可以更直接,這里舉例只是為了說明擴展方法的使用:

//學生類
    public class Student
    {
        public string  Name { get; set; }

        public int Age { get; set; }

        public string City { get; set; }
    }

    //集合類
    public class StudentList:List<Student>
    {
        public StudentList()
        {
            this.Add(new Student() { Name = "張三", Age = 22, City = "北京" });
            this.Add(new Student() { Name = "李四", Age = 23, City = "北京" });
            this.Add(new Student() { Name = "王武", Age = 24, City = "南京" });
            this.Add(new Student() { Name = "何二", Age = 25, City = "南京" });
        }
    }

    //擴展方法
    //根據城市名稱返回學生列表
    public static class StuListExtension
    {
        public static IEnumerable<Student> GetStudentByCity(this List<Student> stuList, string city)
        {   
            var result = stuList.Where(s => s.City == city).Select(s => s);
            return result;
        }
    }

 在Main函數中進行調用:

 class Program
    {
        static void Main(string[] args)
        {            
            StudentList StudentSource = new StudentList();
            IEnumerable<Student> bjStudents = StudentSource.GetStudentByCity("北京");
            Console.WriteLine("北京的學生列表:");
            foreach (var s in bjStudents)
            {
                Console.WriteLine(string.Format("姓名:{0}  年齡:{1}  城市:{2}", s.Name, s.Age, s.City));
            }
            Console.ReadKey();
        }
    }

 結果顯示:

-=本文源碼下載=-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM