Linq之扩展方法

目录

写在前面

系列文章

扩展方法

总结

写在前面

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

系列文章

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

 1 namespace Wolfy.LinqDemo.Extensions
 2 {
 3     /// <summary>
 4     /// string类型扩展方法
 5     /// 静态类
 6     /// </summary>
 7     public static class StringExtension
 8     {
 9         /// <summary>
10         /// 获取字符串的字节数
11         /// </summary>
12         /// <param name="source">字符串</param>
13         /// <returns>字节长度</returns>
14         public static int GetBytesLength(this string source)
15         {
16             byte[] bytes = Encoding.Default.GetBytes(source);
17             return bytes.Length;
18         }
19     }
20 }

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

1 //首先引入命名空间
2 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

时间: 2024-10-14 09:34:42

Linq之扩展方法的相关文章

LINQ常用扩展方法

下面的方法都是IEnumerable<T>的扩展方法: Average计算平均值: Min最小元素:Max最大元素:Sum元素总和: Count元素数量: Concat连接两个序列://Unoin all Contains序列是否包含指定元素: Distinct取得序列中的非重复元素: Except获得两个序列的差集: Intersect获得两个序列的交集: First取得序列第一个元素: Single取得序列的唯一一个元素,如果元素个数不是1个,则报错:!!!严谨的程序. FirstOrDe

LinQ 定义扩展方法3.1

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Diagnostics; namespace ExtensionMethodDump { class Program { static void Main(string[] args) { var song = new { Artist = "Juss

LINQ与扩展方法

What LinQ是什么? 英文全称Language Integrated Query,中文翻译为语言集成查询.它是一组用于语言的扩展,它通过编写代码以查询数据库相同的方式操作内存数据. LINQ的查询操作是比较有特色也比较常用的,但它也有相关的增删改的操作. Why & How 遍历对象.sql语句用的好好的,为什么又引进LINQ? 或许是初学者,好不容易可以掌握sql语句进行增删改查的操作,或许是被固有的思维绑住,使得我们无法跳出圈子,去审视它的优缺点.sql语句肯定有它的缺点,我们先来看个

EF下lambda与linq查询&amp;&amp;扩展方法

1. linq查询数据 WebTestDBEntities db = new WebTestDBEntities(); 1.1 linq查询所有列数据 var userInfoList = from u in db.UserInfo where u.ID == 10 select u; 1.2 linq查询部分列数据 var userInfoList = from u in db.UserInfo where u.ID >= 1 select new { Name = u.UserName, P

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

public static class LinqEx { public static IEnumerable<TResult> LeftExcludingJoin<TSource, TInner, TKey, TResult>(this IEnumerable<TSource> source, IEnumerable<TInner> inner, Func<TSource, TKey> pk, Func<TInner, TKey> f

Linq入门——什么是linq &amp; 扩展方法

一,什么是Linq linq(language integrated Query):语言集成查询: linq包含如下: 对对象的查询,对数据库的查询,对XML的查询. 那么,没有linq前我们是怎样查询的? 先看一个例子: 现在我们要查询大于50的数,: 在没有linq之前,我们的代码时这样的: 使用了linq查询: 首先,从直观上看,代码更加简洁,其次,对于查询部分,接近SQL语句,层次清晰,容易理解: 除了简单高效以为,LINQ的出现解决了很多问题: 1,面向对象与数据访问两个领域长期分裂,

使用Linq扩展方法时容易忽略的小问题

问题重现 下面直接给出用于说明文章主题的完整代码. //************************************************************ // // Linq扩展方法示例代码 // // Author:三五月儿 // // Date:2014/10/01 // // http://blog.csdn.net/yl2isoft // //************************************************************

LINQ中的扩展方法

LINQ中的where(),OderByDescending().Select()并不是IEnumerable<T>的方法,却能使用这些方法,查阅了资料发现是用到了C#的扩展方法. 举个小例子: 定义一个静态类StringExtension和静态方法Foo,关键字this. public static class StringExtension { public static void Foo(this string s) { Console.WriteLine("Foo invok

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

前言 目的没有别的,就是介绍几点在ASP.NETMVC 用到C#语言特性,还有一些其他琐碎的知识点,强行的划分一个范围的话,只能说都跟MVC有关,有的是外围的知识,有的是包含在框架内的. MVC学前篇字样?有噱头的成分也有真实的成分,所以工欲善其事,必先利其器.器是什么?基础嘛,虽然说MVC框架中涉及到的知识很多很多也不是我一篇两篇能说完的,我能做的就是知道多少就跟大家分享多少,当然了随着时间的推移会完善这个系列. 1扩展方法 扩展方法是C# 3.0特性里的知识,它用在最多的地方是在Linq中,