(C# MVC(1))扩展方法

扩展方法是给那些不是你拥有的、因而不能直接修改的类添加方法的一种方便的方法,下面就来演示如何使用扩展方法:

首先 我们在Models文件夹中创建一个Product类,代码如下:

 1 using System;
 2 using System.Collection.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 namespace MyProject.Models{
 6 public class Product{
 7     public Product()
 8      {}
 9     public int ProductID{get;set;}
10     public string Name{get;set;}
11     public string Description{get;set;}
12     public decimal Price{get;set;}
13     public string Category{get;set;}
18   }
19 }

 然后我们在Models文件夹下再创建一个ShoppingCart类

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 namespace MyProduct.Models{      
 6       public class ShoppingCart{
 7            public List<Product> Products {get;set;}
 8 
 9     }
10 
11 }

 上面类很简单,第一个是封装了一个Product的Model,第二个封装了一个Product对象的列表。

接下来就是我们要做的事,我们要对ShoppingCart类中的Product对象求总值,但是我们不能对这个类进行修改,

这样我们就要用到扩展方法了,代码示例如下:

namespace MyProjec.Models{
    public static class MyExtensionMethods{
        public static decimal TotalPrices(this ShoppingCart carParam){ //这里的this很重要,它表示把TotalPrice标记为一个扩展方法,这个方法用于ShoppingCart类
              decimal total=0;
              foreach(Product prod in cartParam.Products)
                 {
                     total+=prod.Price;
                 }
             return total;
            }    
       }   
}

 那我们该如何调用这个扩展方法呢?下面我们会创建一个Controller 和View来展示这个实例。

首先我们创建一个Result视图:

@model String
@{Layout=null;}
<html>
    <Head>
        <meta name="viewport" content="width=device-width"/>
        <title>Result</title>
    </Head>
<body>
    <div>
        @Model
    </div>
</body>
</html>                

 这个视图应该很好理解,是一个强类型视图,模型的类型是String。

接下来我们要创建一个Controller,就创建一个HomeController吧,代码如下:

using Myproject.Models;//这句必须添加,否则无法找到扩展方法,为什么,下面在做解释
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyProject.Controllers{
    public class HomeController:Controller{
        public ViewResult Index(){
                ShoppingCart cart =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}
                   }     
                };
              decimal cartTotal=cart.TotalPrice();
              return View("Result",(object)String.Format("Total:{0:c}",cartTotal));
         }
}
}    

注意:如果不能调用TotalPrice方法,请确保扩展方法MyExtensionMethods在Models文件夹下,也就是你要和Product和ShoppingCart类在同一文件夹下,因为它们必须在同一个命名空间中才能被调用,否则是无法找到的。

 显示结果为:Total:$378.40

posted @ 2015-12-13 22:30  云之星海  阅读(248)  评论(0编辑  收藏  举报