(C# MVC [2])对接口运用扩展方法(对前一个扩展方法的延生)

Product类就不定义了,请参照前一章,

在ShoppingCart类中实现接口

 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 namespace MyProject.Models
 7 {
 8     public class ShoppingCart:IEnumerable<Product>{
 9         public List<Product> Products{get;set;}
10         public IEnumerator<Product> GetEnumerator
11         {
12             return Products.GetEnumerator();
13         }
14         IEnumerator IEnumerable.GetEnumerator()
15         {
16             return GetEnumerator();
17         }
18     }
19 }

现在我们要对上一章的扩展方法就行改造,以使它能够处理IEnumerable<Product>

在接口上工作的扩展方法

using System.Collections.Generic
namespace MyProject.Models{
    public static class MyExtensionMethods
    {
        public static decimal TotalPrice(this IEnumerable<Product> productEnum)
        {
            decimal total=0;
            foreach(Product prod in productEnum)
            {
                total+=prod.Price;
            }
            return total;
        }
    }
}

第一个参数类型改为IEnumerable<Product>,它使方法中的foreach循环直接对Product对象进行操作。

在其他方面,该扩展方法未改变。切换成接口意味着可以对任何IEnumerable<Product>所枚举的Product对象进行总价计算。

将扩展方法运用于同一接口的不同实现,代码如下:

using MyProject.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Mvc;
namespace MyProject.Controllers{
    public class HomeController:Controller{
        public ViewResult Index()
        {
            IEnumerable<Product> products =new ShoppingCart{
                Products=new List<Product>{
                    new Product{Name="Desk",Price=275M},
                     new Product{Name="Ball",Price=19.50M},
                     new Product{Name="Pan",Price=48.95M},
                     new Product{Name="Keyword",Price=34.95M}
                }
                
            };
            //创建一个Product数组
            Product[] productArray={
                new Product{Name="Desk",Price=275M},
                     new Product{Name="Ball",Price=19.50M},
                     new Product{Name="Pan",Price=48.95M},
                     new Product{Name="Keyword",Price=34.95M}
            };
            //获取购物车中产品的总价
            decimal cartTotal=products.TotalPrice();
            //获取数组中产品的总价
            decimal arrayTotal=productArray.TotalPrice();
            return View("Result",(object)String.Format("Cart Total:{0},Array Total:{1}",cartTotal,arrayTotal));
        }
        
    }
    
    
}

运行结果,希望小伙伴们自己去尝试喔,应该会和前面的出来的结果一样的。

总结:这个支持是有编译器处理的,因此可以对较早版本的C#代码将仍然可以编译,我们可以看出在这个例子中使用的是另一种泛型集合类。

 

posted @ 2015-12-14 23:27  云之星海  阅读(212)  评论(0)    收藏  举报