目录

写在前面

系列文章

扩展方法

总结

写在前面

上篇文章介绍了隐式类型,自动属性,初始化器,匿名类的相关概念,及通过反编译的方式查看了编译器帮我们做了那些事。本篇文章将介绍扩展方法的知识点,及如何定义,如何使用的相关内容。

系列文章

Linq之Lambda表达式初步认识

Linq之Lambda进阶

Linq之隐式类型、自动属性、初始化器、匿名类

扩展方法

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。

最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable 和 System.Collections.Generic.IEnumerable<T> 类型。 若要使用标准查询运算符,请先使用 using System.Linq 指令将它们置于范围中。 然后,任何实现了 IEnumerable<T> 的类型看起来都具有 GroupBy、OrderBy、Average 等实例方法。 在 IEnumerable<T> 类型的实例(如 List<T> 或 Array)后键入“dot”时,可以在 IntelliSense 语句完成中看到这些附加方法。

首先看一下啊,扩展方法涨什么样子

通过上图可以发现,扩展方法所在的类必须是静态类,方法必须为静态方法,并且方法第一个参数必须以this修饰符开始。

如何自定义扩展方法?

1.定义一个静态类以包含扩展方法。 该类必须对客户端代码可见。

2.将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。

3.该方法的第一个参数指定方法所操作的类型;该参数必须以 this 修饰符开头。

4.在调用代码中,添加一条 using 指令以指定包含扩展方法类的命名空间。

5.按照与调用类型上的实例方法一样的方式调用扩展方法。

请注意,第一个参数不是由调用代码指定的,因为它表示正应用运算符的类型,并且编译器已经知道对象的类型。 您只需通过 n 为这两个形参提供实参。

 一个例子

为String扩展这样一个方法:返回字符串的字节数。在项目中添加一个这样的类StringExtension

 namespace Wolfy.LinqDemo.Extensions
{
/// <summary>
/// string类型扩展方法
/// 静态类
/// </summary>
public static class StringExtension
{
/// <summary>
/// 获取字符串的字节数
/// </summary>
/// <param name="source">字符串</param>
/// <returns>字节长度</returns>
public static int GetBytesLength(this string source)
{
byte[] bytes = Encoding.Default.GetBytes(source);
return bytes.Length;
}
}
}

在使用时,首先引入你的扩展方法所在的静态类所在命名空间,比如在这个例子中,需要引入

 //首先引入命名空间
using Wolfy.LinqDemo.Extensions;

然后你就可以这样来用,就好比你定义的这个方法就是string类中定义的一样。

通过代码也发现这样的问题,扩展方法,在无法修改源代码的情况下,提供了一种为该类来添加行为的方式。比如在这里咱们无法修改string类的源代码,也不可能在string类的方法中添加一个GetBytesLength的方法,但是通过扩展方法,在客户端使用的时候,就好比,这个方法就是string类的方法一样。

在鼠标放在方法名上时,也会提示该方法是扩展方法,如图

输出结果

总结

1、扩展方法为静态方法,所在的类必须为静态类,方法第一个参数必须以this修饰符开头。

2、扩展方法在使用的时,必须能够访问到。

3、在使用时需引入扩展方法所在的命名空间。(当然你也可以直接使用要扩展的类型的命名空间,比如string类型的命名空间为System,你可以使用System作为StringExtension的命名空间,这样使用的时候不需要引入命名空间了。但一般不建议这样做!)

参考文章

MSDN:http://msdn.microsoft.com/zh-cn/library/bb383977.aspx

http://msdn.microsoft.com/zh-cn/library/bb311042.aspx

Linq之扩展方法的更多相关文章

  1. EF下lambda与linq查询&&扩展方法

    1. linq查询数据 WebTestDBEntities db = new WebTestDBEntities(); 1.1 linq查询所有列数据 var userInfoList = from ...

  2. 21扩展IEnumerable<T>泛型接口自定义LINQ的扩展方法

    LINQ方法实际上是对IEnumerable<TSource>的扩展,如图:   本篇自定义一个MyWhere方法,达到与Where相同的效果.     使用LINQ自带的Where方法 ...

  3. Linq与扩展方法

    使用数据集 /// <summary> /// 库房信息类 /// </summary> public class Kfxx { /// <summary> /// ...

  4. linq和扩展方法

    c#的扩展方法 1.必须是在一个非嵌套.非泛型的静态类中的静态方法 2.至少一个参数,第一个参数附加this,不能有其他修饰符如out.ref 3.第一个参数不能是指针类型 上面例子是自定义的一个扩展 ...

  5. [转][C#]Linq 的扩展方法

    public static class LinqEx { public static IEnumerable<TResult> LeftExcludingJoin<TSource, ...

  6. linq本质扩展方法+lambda表达式

    string[] names = { "aa","bb","cc","dd"}; /* IEnumerable<s ...

  7. 从扩展方法到匿名方法再到LINQ

    1.首先我们应该知道什么是扩展方法: 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

  8. ASP.NET MVC学前篇之扩展方法、链式编程

    ASP.NET MVC学前篇之扩展方法.链式编程 前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的 ...

  9. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

随机推荐

  1. Linux系统升级更新openssh 7.3p1

    放在最前面:鉴于网上爬虫猖獗,博客被盗时有发生,这里需要来个链接,大家请认准来自博客园的Scoter:http://www.cnblogs.com/scoter2008,本文将持续更新 最近绿盟给扫描 ...

  2. JavaScript中的不可见数据类型

    JS提供了一些内置对象.函数和构造器供我们编程,如Math.parseInt.Object.Array等.这些都是可见的,编程时可以使用的.比如我可以new Object 或 new Array. 有 ...

  3. scau 8633 回文划分

    8633 回文划分 时间限制:1000MS  内存限制:1000K 题型: 编程题   语言: 无限制 Description 我们说一个字符串是回文串,那么意味着这个串从两边读起来的字母都是一样的. ...

  4. [转]Worksheet.Change Event (Excel)

    本文转自:https://msdn.microsoft.com/en-us/library/office/ff839775.aspx#AboutContributor Example   The fo ...

  5. [转]Ionic最佳实践-使用模态窗口modal

    本文转自:http://m.blog.csdn.net/blog/betreex/45649689 原文地址:Ionic最佳实践-使用模态窗口modal 模态窗口的结构 在Ionic中,模态窗口通过$ ...

  6. MongoDB配置多个ConfigDB的问题(笔记)

    由于在部署集群之前没有做好的规划,在集群中只有一个configserver和一个mongos.网上都推荐多个configserver,本人在使用的过程中发现在启动mongos进程时,congfigdb ...

  7. [ubuntu]deb软件源

    虽然ubuntu的中国服务器的速度已经非常不错,但是难免,会有网络不畅的情形,所以修改软件源地址是一个基础的知识点. 修改ubuntu的软件源的方式有多种,一直是通过ubuntu软件中心提供的UI,还 ...

  8. 孙鑫视频学习:改变窗口过程函数中出现error C2440错误的解决方法

    在Visual Studio 2010中,即使代码是完完全全按照孙鑫视频中的敲,也会在出现error C2440,这是因为开发平台由VC6.0升级至VS2010,需要将原有的项目迁移.VS2010对消 ...

  9. Django数据库怎么给字段设置主键

    id = models.IntegerField(primary_key = True) 附: null :缺省设置为false.通常不将其用于字符型字段上,比如CharField,TextField ...

  10. JMeter学习(三)元件的作用域与执行顺序

    1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(conf ...