(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#代码将仍然可以编译,我们可以看出在这个例子中使用的是另一种泛型集合类。

浙公网安备 33010602011771号