当你有下面这样一个需求的时候:在项目中,类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以。但是由于某种原因,你不能修改类A本身的代码(如类来自第三方,而我没有源码),但是又必须需要增加功能到类A中去,怎么办? 这个时候扩展方法(Extension Methods)就会帮助你完成上述功能了。
一个例子:来自于《精通ASP.NET MVC5》
/// <summary> /// 商品类 /// </summary> public class Product { public string Name { get; set; } public decimal Price { get; set; } } /// <summary> /// 购物车 /// </summary> public class ShoppingCart { public List<Product> Products { get; set; } }
我们希望购物车可以添加一个计算总价的功能,但是我们不能自己修改购物车的类,怎么办呢?直接上代码
1 public static class MyExtensionMethods 2 { 3 // 这里定义扩展方法 4 public static decimal TotalPrices(this ShoppingCart cart) 5 { 6 return cart.Products.Sum(p => p.Price); 7 } 8 } 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 ShoppingCart myCart = new ShoppingCart 14 { 15 Products=new List<Product> 16 { 17 new Product{Name="apple",Price=1M}, 18 new Product{Name="orange",Price=2M}, 19 new Product{Name="banana",Price=3M}, 20 new Product{Name="pear",Price=4M}, 21 } 22 }; 23 //ShoppingCart的实例myCart可以调用扩展方法 TotalPrices() 24 decimal totalPrices = myCart.TotalPrices(); 25 Console.WriteLine($"总价格是:{totalPrices}"); 26 Console.ReadKey(); 27 } 28 }
其实,扩展方法(Extension Methods)当然需要一个类包装,这个类必须是静态类,扩展方法(Extension Methods)必须也是静态方法,方法的参数中必须要有被扩展类,此参数前面用 this 关键字修饰。