.NET3.5的扩展方法

在学MVC的过程中,用到System.Web.Routing.RouteColletion

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Default",                       
                "{controller}/{action}/{id}",                        
                new { controller = "Home", action = "Index", id = "" } defaults
            );
        }

并用到RouteColletion的MapRoute方法,但是一查,RouteColletion里并没有MapRoute方法。


用“转到定义”的功能,跳到System.Web.Mvc.RouteCollectionExtensions类的MapRoute方法中。


然而System.Web.Mvc.RouteCollectionExtensions类的MapRoute方法并不完全跟RouteColletion里的MapRoute方法一样。


在RouteCollectionExtensions里定义的是:public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);

 但在RouteColletion的实例上提示的是:public static Route MapRoute(string name, string url, object defaults);


MapRoute方法的重载也不匹配。究竟是RouteCollectionExtensions和RouteColletion是什么关系呢?他们既不是相互继承,也不可能只是简单的调用。


后来查了一下才知道,原来是用到.NET3.5的扩展方法。


用扩展方法,我们可以为已经存在的类添加方法。


做了一个简单的测试:

 

using System;
using System.Web;
using xx;
namespace yy
{
    public class yourcls
    {
        public int num;
        public yourcls(int n)
        {
            this.num = n;
        }
    }
}
namespace xx
{
    using yy;
    public static class mycls
    {
        public static void print(this yourcls yy,string str)
        {//对yourcls类的扩展方法
            HttpContext.Current.Response.Write(str + yy.num.ToString());
        }
    }
}
public partial class Default5 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        yy.yourcls a = new yy.yourcls(3);
        a.print("这是:");
    }
}

命名空间yy下的yourcls类是已存在的类。命名空间xx下的类mycls对其进行方法的扩展,使得yourcls类可以使用mycls里定义的扩展方法。

定义扩展方法的关键有几点:

1、 mycls类和扩展方法都要是static的。

2、 引用相应的命名空间。

3、 扩展方法的第一个参数要是要进行扩展的类,而且要加上this修饰。

菜鸟笔记。。。。。

posted @ 2010-12-08 12:30  ailove  阅读(440)  评论(0编辑  收藏  举报
返回顶端^