首页 > 代码库 > 委托是怎么最终变成linq表达式的?(下)

委托是怎么最终变成linq表达式的?(下)

扩展方式(Extension Method)是给那些不是你拥有的,因而不能直接修改的类添加方法的一种方便的方法。首先我们定义一个类

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Rocky{   public  class Product    {       public int ProductID { set; get; }       public string Name { set; get; }       public string Description { set; get; }       public decimal Price { set; get; }       public string Category { set; get; }    }}

上述定义了一个组织数据的实体类  接下来我们定义一个购物车类型

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Rocky{    public class ShoppingCar    {        public List<Product> Products { set; get; }    }}

这个购物车类型里面只有一个字段就是商品的集合Porducts 现在我们需要求出商品价格的总值,但我们不能对这个类进行修改。那么我们可以利用扩展方法来完成。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Rocky{   public   static class MyExtensionMethod  //public修饰  静态类    {       public static decimal TotalPrices(this ShoppingCar car)//静态方法  第一个参数必须是this修饰要扩展的类名       {           decimal total = 0;           foreach (var item in car.Products)           {               total += item.Price;           }          return  total;       }    }}

最终我们看一下运行起来的结果

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Rocky{    class Program    {        static void Main(string[] args)        {            ShoppingCar cart = new ShoppingCar            {                Products = new List<Product> {                    new Product{Name="kaka", Price=234M},                    new Product{Name="Messic", Price=211M},                    new Product{Name="lisi",Price=12M}                 }            };            decimal total = cart.TotalPrices();            Console.WriteLine("Total:{0}",total);            Console.ReadKey();        }    }}

对接口运用扩展方法

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Rocky{    public class ShoppingCar:IEnumerable<Product>    {        public List<Product> Products { set; get; }      public   IEnumerator<Product> GetEnumerator()        {            return Products.GetEnumerator();        }        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()        {            return GetEnumerator();        }    }}

扩展接口方法

   public static decimal TotalPrices(this IEnumerable<Product> prods)       {           decimal total = 0;           foreach (var item in prods)           {               total += item.Price;           }           return total;                 }

结果是

   IEnumerable<Product> cart = new ShoppingCar            {                Products = new List<Product> {                    new Product{Name="kaka", Price=234M},                    new Product{Name="Messic", Price=211M},                    new Product{Name="lisi",Price=12M}                 }            };                        Console.WriteLine("Total:{0}",cart.TotalPrices());            Console.ReadKey();        }

 通过扩展方法结果可以看出接口运用扩展方法。

  最后我们要演示的一种扩展方法是,它可以对对象集合进行过滤

委托是怎么最终变成linq表达式的?(下)