.net中有趣的“扩展方法”(Extension Method)
2012-03-02 12:45
351 查看
我在看ASP.net MVC代码的时候,发现有这么一个调用:
其中routes是RouteCollection类,而RouteCollection类中却没有MapRoute方法,MapRoute方法是RouteCollectionExtensions类的方法,从元数据中获取到的RouteCollectionExtensions的描述如下:
此类表面上看是个独立的类,并不是从其它类继承下来的,也没有实现什么Interface,但注意看:
首先它是个static类,其方法也都是static
其实它的的各方法的首参数是“this RouteCollection”,类型前面加了个“this”
这表示什么呢?其实这就是.net的一种有趣的用法,那就是扩展一个类的方法,但又不直接修改这个类的代码,下面有个简单的例子:
“AppendWorld”这个方法看起来就像是属于“Hello”这个类的似的。
这样做有一点限制:那就是依旧不能打破类的封装,扩展方法只能访问其要扩展的类的public成员,别的成员还是动不了的。
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成员,别的成员还是动不了的。
相关文章推荐
- On Extension Method: 扩展方法该如何使用
- On Extension Method: 扩展方法该如何使用
- C# 扩展方法Extension Method
- [C#][VB.NET]擴充方法 (Extension Method)
- .Net下实现可扩展的编程方法简述
- ASP.Net MVC开发基础学习笔记(2):HtmlHelper与扩展方法
- Tip/Trick: Building a ToJSON() Extension Method using .NET 3.5
- jQuery Ajax方法调用 Asp.Net WebService、WebMethod 的详细实例代码
- Asp.NET MVC Widget开发 - Html.Widget扩展方法
- .NET WebApi Delete方法访问提示:“HTTP 错误 405.0 - Method Not Allowed”
- ASP.NET MVC自定义辅助方法Helper Method
- 艾伟_转载:扩展方法 之 Asp.Net篇
- ASP.NET MVC之持久化TempData及扩展方法(十三)
- 学用 ASP.Net 之 "字符串" (4): string 类的扩展方法
- C#.NET为List添加扩展方法:获取唯一值
- 解决“IIS中找不到web扩展服务ASP.NET v2.0.50727”的方法 分享
- JQuery直接调用asp.net后台WebMethod方法
- ASP.NET 常用的正则表达式(使用C#3.0扩展方法)
- asp.net中CSharpThinking扩展方法分析