扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 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()); } }
程序运行结果如下图所示
这个例子并没有什么意义,简单理解,扩展方法就是向已有的类型中添加新的方法。