C#中的扩展方法

  当你有下面这样一个需求的时候:在项目中,类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 关键字修饰。

原文地址:https://www.cnblogs.com/wyy1234/p/9290374.html