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

 



转载于:https://www.cnblogs.com/guogangj/archive/2012/03/02/2376927.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#扩展方法是一种特殊的静态方法,它允许您向现有的类型添加新的方法,而无需修改原始类型的定义。通过扩展方法,您可以在不创建新的派生类型或重新编译代码的情况下,为现有类型添加功能。 扩展方法的定义方式如下: ```csharp public static class ExtensionClass { public static ReturnType ExtensionMethod(this ExtendedType instance, parameters) { // 扩展方法的实现 } } ``` 其,`ExtensionClass`是包含扩展方法的静态类,`ExtensionMethod`是扩展方法的名称,`ExtendedType`是要扩展的类型,`instance`是该类型的实例,`parameters`是方法的参数,`ReturnType`是方法的返回类型。 通过扩展方法,您可以像调用实例方法一样调用它们,而无需创建该类型的实例。例如,假设您想为字符串类型添加一个方法来反转字符串,可以使用扩展方法实现如下: ```csharp public static class StringExtensions { public static string Reverse(this string str) { char[] charArray = str.ToCharArray(); Array.Reverse(charArray); return new string(charArray); } } ``` 然后,您可以在代码使用该扩展方法: ```csharp string myString = "Hello World"; string reversedString = myString.Reverse(); // 调用扩展方法 Console.WriteLine(reversedString); // 输出:dlroW olleH ``` 扩展方法在C#非常有用,可以提高代码的可读性和灵活性,同时避免了修改原始类型的定义。它们经常用于扩展.NET框架的基本类型,也可以用于自定义类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值