.NET 的扩展方法是在.NET 3.0引入的,MSDN给出的定义是:扩展方法使你能够向现有类型“添加”方法(包括你自定义的类型和对象噢),而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但是可以像扩展类型上的实例方法一样进行调用。对于用C#编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异。

看完上面的解释,有点摸不着头脑,我们在具体演示一下:

例子一:扩展Student类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace efdemo6
{
class Program
{
static void Main(string[] args)
{
Student st = new Student()
{
StudentName = "张三",
Score = ,
Birthday = DateTime.Parse("1990-1-1")
};
st.ShowStudent();//调用 扩展方法
}
}
//扩展学生类的功能
public static class ExStudent
{
//打印学生信息
public static void ShowStudent(this Student st)
{
Console.WriteLine("姓名:"+st.StudentName+" 分数:"+st.Score+" 生日:"+st.Birthday.ToString());
}
}
}

说明:我们为学生类添加一个功能,打印学生信息 ShowStudent。

注意:1.扩展方法只能定义在 非泛型的静态类中,使用 static修饰,参数使用this关键字 修饰要扩展的类,此处为Student类扩展方法, this Student st

执行结果:

如图:扩展方法的图标带有向下的箭头,且被标注为:扩展。

例子二 扩展List<T>泛型类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace efdemo6
{
class Program
{
static void Main(string[] args)
{
List<Student> list = new List<Student> {
new Student()
{
StudentName = "张三",
Score = ,
Birthday = DateTime.Parse("1990-1-1")
},
new Student()
{
StudentName = "李四",
Score = ,
Birthday = DateTime.Parse("1990-1-1")
}
}; Console.WriteLine("===排序前===");
foreach (var v in list)
{
Console.WriteLine(v.StudentName + " " + v.Score);
}
list.OrderBy();
Console.WriteLine("===排序后===");
foreach (var v in list)
{
Console.WriteLine(v.StudentName + " " + v.Score);
}
}
}
//扩展学生类的功能
public static class ExStudent
{
//扩展集合List 打印所有学生信息
public static void OrderBy(this List<Student> list)
{ list.Sort(new MyCompare());
} class MyCompare : IComparer<Student>
{
//比较学生的分数
public int Compare(Student st1, Student st2)
{
if (st1.Score > st2.Score) return ;
if (st1.Score == st2.Score) return ;
return -;
}
}
}
}

执行结果:

说明:此处定义了2个学生对象,张三 100分 李四 80分 ,并封装在List<Student>集合中,现在扩展一个OrderBy方法,按照学生分数排序。list.Sort() 方法传递一个 实现了IComparer<T>接口的实现类对象,并实现里面的Compare方法。

按F2查看Sort方法源代码:

可以看到,List<T>还有另一个sort方法,传递的是一个委托。

所以我们可以像下面这样写:

    //扩展学生类的功能
public static class ExStudent
{
public static void OrderBy(this List<Student> list)
{ list.Sort((x, y) =>
{
if (x.Score > y.Score) return ;
if (x.Score == y.Score) return ;
return -;
});
}
}

传递一个lamba表达式,运行结果相同。

.NET 扩展方法的更多相关文章

  1. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  2. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  3. 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇

    最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...

  4. C#的扩展方法解析

    在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...

  5. 扩展方法(C#)

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

  6. 扩展方法解决LinqToSql Contains超过2100行报错问题

    1.扩展方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  7. C#扩展方法

    扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法就相当于一个马甲,给一个现有类套上,就可以为这个类添加其他方法了. 马甲必须定义为stati ...

  8. 枚举扩展方法获取枚举Description

    枚举扩展方法 /// <summary> /// 扩展方法,获得枚举的Description /// </summary> /// <param name="v ...

  9. 扩展方法 1 简单的string扩展方法

    这里是关于 String的简单扩展方法 (静态类 静态方法 this 类型 这里是string) static class Program { static void Main(string[] ar ...

  10. C#中的扩展方法

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

随机推荐

  1. SAP abap 需找出口(BADI)的几种方法

    需找BADI方法有很多,据公司的牛人说,他知道的就不止5种 现在给出一些比较简单的方法 首先,大家要知道,一个程序的出口不会太多,需找出口,很多的时候都是在尝试 第二,方法:首先会给出事务码,然后通过 ...

  2. Web页中table导出到execl(带模板)

    1.将excel另存为html,将其复制到aspx文件中 2.输出格式为excel InitData(); Response.Clear(); Response.Buffer = true; Resp ...

  3. 在GitHub上建立个人主页的方法

    GitHub就不需要介绍了,不清楚可以百度一下.只说目前GitHub是最火的开源程序托管集中地了,连PHP的源码都在GitHub上面托管了(https://github.com/php ). GitH ...

  4. Toad快速入门

    Toad快速入门       在实际中,Toad的用户很少用到其强大的新特性,同时新用户的摸索式熟悉Toad往往花费更多的时间.为此,铸锐数码为每个新购买Toad客户,提供两人次的在线培训服务,帮助客 ...

  5. C++学习笔记22:设备

    设备类型 设备文件的性质 设备文件不是普通的磁盘文件 读写设备的数据需要与相应的设备驱动器通信 设备文件的类型 字符设备:读写串行数据字节流,如串口.终端等 块设备:随机读写固定尺寸数据块,如磁盘设备 ...

  6. 《JavaScript模式》第5章 对象创建模式

    @by Ruth92(转载请注明出处) 第5章:对象创建模式 JavaScript 是一种简洁明了的语言,并没有其他语言中经常使用的一些特殊语法特征,如 命名空间.模块.包.私有属性 以及 静态成员 ...

  7. .Net 的一些插件

    1)Webmatrix WebMatrix是一个Microsoft提供的免费的Web开发工具,包括你开发网站所需要的一切.从开源Web应用.内置网页模板开始或者完全自己编写代码.它全面而且简单,最重要 ...

  8. cornerstone忽略显示.DS_Store文件

    在MacOS上使用svn工具时,经常发现变化列表里出现一堆的?文件,.DS_Store,对有强迫症的人来说很郁闷.处理起来很简单,就是在svn的配置里忽略这个文件.#ue ~/.subversion/ ...

  9. java导出excel报错:getOutputStream() has already been called for this response

    对于java导出excel报错的问题,查了很多都说是在使用完输出流以后调用以下两行代码即可 out.clear(); out = pageContext.pushBody(); 但这也许是页面上输出时 ...

  10. html+css图片下弹出蒙版

    鼠标移入时弹出蒙版!!! html<!DOCTYPE html<html lang="en"<head> <meta charset="UT ...