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