当前位置 > 首页 > Asp.net

Pro ASP.Net MVC 3 Framework学习笔记之六

12/6/2011 11:45:00 PM来源:Asp.net

本次笔记分为两个部分:C#语言的部分特性和MVC3里面提供的新视图引擎Razor的@句法。今天晚上的笔记是第一部分:C#的部分特性(我主要选择扩展方法,泛型委托,Lambda表达式等内容,选择这些是因为我对这几个部分不是很熟悉)。如果你已经对C#2.0及3.0里面出现的几个特性比较了解,那你完全可以忽略这部分直接去看下次的关于Razor的笔记。

一,扩展方法(Extension Methods)
1.扩展方法给我们提供了一种很便捷的方式,通过这种方式我可以给那些不是我们自己创建的类(如第三方组件里面的)或是我们不能直接修改的类添加方法。下面是一个关于购物车的例子,我们定义一个ShoppingCart类,如下所示:

public class ShoppingCart 
{
public List<Product> Products { get; set; }
}

public class Product
{
public int ProductID { get; set; }
public string Name { get; set;}
public string Description { get; set;}
public decimal Price { get; set; }
public string Category { set; get;}
}

这个类简单吧,呵呵。现在我们需要知道购物车里面Products的总价,但是我们不能去直接更改ShoppingCart类,这种情况的确是存在的,比如这是第三方的组件,我们没有源码。这个问题显然符合定义扩展方法的条件,所以我们可以这样做:

public static class MyExtensionMethods 
{
public static decimal TotalPrices(this ShoppingCart cartParam)
{
decimal total = 0;
foreach (Product prod in cartParam.Products)
{
total += prod.Price;
}
return total;
}
}

this关键字是必须的,用this指示我们要对哪个类添加方法(称为这个类的扩展方法),后面也可以跟其他类型的参数。这里的参数就是ShoppingCart类型。因为我们计算就是购物车的总价。实现的方法也很简单,遍历购物车里面的商品,把价格累加。
注意:扩展方法并不是让我们通过这样一种规则来打破给类定义方法,属性,字段等,所以我们定义类的成员的时候一般都是在类里面定义。扩展方法只不过让我们可以在必要的时候扩展类的功能,而且仅仅使用的是你能访问的成员来对其进行扩展。下面看看如何使用上面的定义的扩展方法,如下所示:

using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
ShoppingCart cart = new ShoppingCart
{
Products = new List<Product>
{
new Product {Name = "Kayak", Price = 275M},
new Product {Name = "Lifejacket", Price = 48.95M},
new Product {Name = "Soccer ball", Price = 19.50M},
new Product {Name = "Corner flag", Price = 34.95M}
}
};
decimal cartTotal = cart.TotalPrices();
Console.WriteLine("Total: {0:c}", cartTotal);
}
}

2.现在我们对ShoppingCart类进行扩展

using System.Collections;
using System.Collections.Generic;
public class ShoppingCart : IEnumerable<Product>
{
public List<Product> Products { get; set; }
public IEnumerator<Product> GetEnumerator()
 {
return Products.GetEnumerator();//对Products进行迭代获取Product列表
}
IEnumerator IEnumerable.GetEnumerator()
 {
return GetEnumerator();
}
}

上面我们让ShoppingCart继承了一个支持迭代的泛型接口,获取了所有的Products。
下面我们修改扩展方法,对IEnumerable<Product>进行扩展,如下所示:


  • Digital Signing Framework of the Open Packing Conventions (Open Packing Conventions的数字签名框架)

    10/9/2007 4:23:00 AM

    摘要: 这一遍文章是介绍在OPC中的数字签名框架的,我们都知道 microsoft现在文档标准有两个,一个是office2007上用的Open XML Format,和 XML Paper Spec

  • [译稿]Silverlight 3:Out-of-browser更新模块

    1/22/2010 1:29:00 PM

    阅读: 425 评论: 0 作者: 焦炜 发表于 2010-01-22 09:38 原文链接 请阅读更新:虽然用于检查更新的API已经改变,但是更新模块调用的方法CheckAndDown

  • List<t> paging via LINQ to Objects

    7/13/2009 10:19:00 PM

    The various grid controls shipped with asp.net provides plug and play data paging on its underlying

  • CMAP Code Camp Sessions are posted

    4/12/2007 8:59:00 PM

    The CMAP Code Camp is being held on Saturday 4/21/2007 from 9AM to 7PM - you can register here .

  • 蒙特霍尔问题的c#程序演示

    11/17/2009 4:20:00 AM

    阅读: 31 评论: 0 作者: elite_lcf 发表于 2009-11-17 01:06 原文链接 蒙特霍尔问题: 蒙提霍尔问题是一档由霍尔(Hall)主持的游戏节目: 让我们来

  • C#实现Socket传输简单数据

    3/20/2007 7:30:00 PM

    摘要: C#实现Socket传输简单数据,以前我在blog.csdn.net上写的一篇文章。给大家分享。 阅读全文 笑缘 2007-03-20 16:14 发表评论

  • 需求阶段如何书写Use Case

    12/1/2009 2:25:00 PM

    阅读: 130 评论: 1 作者: 灵动生活 发表于 2009-12-01 13:43 原文链接 如何书写 Use Case 什么是 Use Case 用例描述文档的

  • System.Net.Mail 发送邮件的问题

    10/26/2011 4:52:00 PM

    System.Net.Mail 发了封测试邮件 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encod

  • Silverlight Surface Demonstration

    6/4/2007 3:57:00 PM

    Microsoft announcedsome days ago its Surface product . If you didnt had a look on the videos you s

  • 多表单系统框架设计(一)

    8/4/2009 11:03:00 PM

    “多表单系统”,顾名思义,就是多个不同形式的表单构成的一个系统,是一个极其抽象的概念。它在企业内部也是一种常见的管理信息系统,每个表单的内容和流程不尽相同,也可以说每个表单是一个子系统。在企业内部,