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



  • 相关阅读:
    RHEL7管道与重定向
    RHEL7软件包管理
    RHEL7用户管理
    RHEL7文件管理
    RHEL7文件查找
    RHEL7文件权限
    RHEL7文件归档与压缩
    RHEL7进程管理
    博客园样式美化
    flask+python页面修改密码功能
  • 原文地址:https://www.cnblogs.com/guogangj/p/2376927.html
Copyright © 2020-2023  润新知