.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修饰。
菜鸟笔记。。。。。

浙公网安备 33010602011771号