zoukankan      html  css  js  c++  java
  • 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 关键字修饰。

  • 相关阅读:
    Java 借助poi操作PDF工具类
    【ES】Java High Level REST Client 使用示例(增加修改)
    数据库表结构查询SQL
    MySQL windows中的存储备份
    jenkins + Ansible Plugin + ansi-color 让结果显示颜色
    jenkins 构建历史 显示版本号
    python 2.7.11 环境安装
    ansible 安装和使用
    豌豆夹Redis解决方案Codis安装使用
    Spark on Mesos部署
  • 原文地址:https://www.cnblogs.com/wyy1234/p/9290374.html
Copyright © 2011-2022 走看看