zoukankan      html  css  js  c++  java
  • .net中有趣的“扩展方法”(Extension Method)

    我在看ASP.net MVC代码的时候,发现有这么一个调用:

    routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

    其中routes是RouteCollection类,而RouteCollection类中却没有MapRoute方法,MapRoute方法是RouteCollectionExtensions类的方法,从元数据中获取到的RouteCollectionExtensions的描述如下:

        public static class RouteCollectionExtensions
    {
    public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values);
    public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values);
    public static void IgnoreRoute(this RouteCollection routes, string url);
    public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
    public static Route MapRoute(this RouteCollection routes, string name, string url);
    public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
    public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
    public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
    public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
    public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
    }

    此类表面上看是个独立的类,并不是从其它类继承下来的,也没有实现什么Interface,但注意看:

    • 首先它是个static类,其方法也都是static
    • 其实它的的各方法的首参数是“this RouteCollection”,类型前面加了个“this”

    这表示什么呢?其实这就是.net的一种有趣的用法,那就是扩展一个类的方法,但又不直接修改这个类的代码,下面有个简单的例子:

        class Hello
    {
    private string m_strHello = "Hello";
    public string String { get { return m_strHello; } set { m_strHello = value; } }
    }

    static class HelloExtensions
    {
    public static void AppendWorld(this Hello hello)
    {
    hello.String += " World";
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Hello hello = new Hello();
    hello.AppendWorld();
    Console.WriteLine(hello.String);
    }
    }

    “AppendWorld”这个方法看起来就像是属于“Hello”这个类的似的。

    这样做有一点限制:那就是依旧不能打破类的封装,扩展方法只能访问其要扩展的类的public成员,别的成员还是动不了的。



  • 相关阅读:
    程序员利用javascript代码开发捕鱼游戏
    Web前端培训学习心得
    给Web前端初学者的一些建议和学习路线
    web前端+javascript+h5电子书籍和实战分享
    JavaScript实现浏览器本地的图像移动、大小调整和裁剪
    纯JavaScript实现异步Ajax的基本原理
    2018年最重要的HTML5开发手册,传播正能量
    虎虎的小尾巴:在大宗商品研究这块如何看待“供需决定的是利润而不是价格”?2017-03-14
    虎虎的小尾巴:对国内商品交易的理解 2017-01-11
    虎虎的小尾巴:金融数学对做交易有用吗?
  • 原文地址:https://www.cnblogs.com/guogangj/p/2376927.html
Copyright © 2011-2022 走看看