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成员,别的成员还是动不了的。



  • 相关阅读:
    vue(21)初识Vuex
    ESCMScript6(3)Promise对象
    vue(20)生命周期函数
    vue(19)嵌套路由
    vue(18)路由懒加载
    vue(17)vue-route路由管理的安装与配置
    vue(16)vue-cli创建项目以及项目结构解析
    vue(15)vue-cli介绍与安装
    webpack(11)配置文件分离为开发配置、生成配置和基础配置
    webpack(10)webpack-dev-server搭建本地服务器
  • 原文地址:https://www.cnblogs.com/guogangj/p/2376927.html
Copyright © 2011-2022 走看看