擴充方法使您能夠向現有類型“添加”方法,而無需建立新的衍生類別型、重新編譯或以其他方式修改原始類型。 擴充方法是一種特殊的靜態方法,但可以像擴充類型上的執行個體方法一樣進行調用。 對於用 C# 和 Visual Basic 編寫的用戶端代碼,調用擴充方法與調用在類型中實際定義的方法之間沒有明顯的差異。為了更好的理解,我寫了一個小程式,希望對初學的朋友有所協助。
首先我建立了一個控制台用用程式,然後建立了一個名為MyClassLibrary的類庫,類庫裡就寫了一個Book類。如所示
在Book類中,我定義了Id,Title,Price,Publisher四個屬性,分別表示書的編號,名稱,價格和出版社。同時,還寫了一個GetBookInfo方法,用於擷取書的資訊。
Book類的代碼如下
namespace MyClassLibrary{ public class Book { /// <summary> /// 編號 /// </summary> public string Id { get; set; } /// <summary> /// 書名 /// </summary> public string Title { get; set; } /// <summary> /// 價格 /// </summary> public decimal Price { get; set; } /// <summary> /// 出版社 /// </summary> public string Publisher { get; set; } public Book() : this(string.Empty, string.Empty, decimal.Zero, string.Empty) { } public Book(string id, string title) : this(id, title, decimal.Zero, string.Empty) { } public Book(string id, string title, decimal price, string publisher) { this.Id = id; this.Title = title; this.Price = price; this.Publisher = publisher; } /// <summary> /// 擷取書籍資訊 /// </summary> public string GetBookInfo() { return string.Format("編號:{0} 書名:{1} 價格:{2} 出版社:{3}", Id, Title, Price, Publisher); } }}
下面我們在測試程式中執行個體化一個Book類的對象,在Book類中我們已經定義了一個方法GetBookInfo,通過調用這個方法就可以取得書的資訊。但是,正好有一天書店要搞活動,這本書要打五折,我們就要修改書的價格,但是在給定的Book類中並沒有提供修改書價格的方法,怎麼辦呢?對,擴充方法就是一個解決的辦法。
我們為Book類寫一個修改書價格的擴充方法ModifyPrice。代碼如下:
public static class BookExtension { /// <summary> /// 修改書的價格 /// </summary> /// <param name="book">book對象</param> /// <param name="price">價格</param> public static void ModifyPrice(this Book book, decimal price) { book.Price = price; } }
測試程式碼為:
class Program { static void Main(string[] args) { //Book book = new Book("20110711", "紅樓夢", 79.00m, "北京出版社"); Book book = new Book { Id = "20110711", Title = "紅樓夢", Price = 79.00m, Publisher = "北京出版社" }; Console.WriteLine("書籍資訊:"); Console.WriteLine(book.GetBookInfo()); Console.WriteLine("今天搞活動,本書打五折"); book.ModifyPrice(book.Price * 0.5m); Console.WriteLine(book.GetBookInfo()); } }
程式運行結果如所示
這個例子並沒有什麼意義,簡單理解,擴充方法就是向已有的類型中添加新的方法。