.NET 扩展方法
.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 扩展方法的更多相关文章
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇
最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...
- C#的扩展方法解析
在使用面向对象的语言进行项目开发的过程中,较多的会使用到“继承”的特性,但是并非所有的场景都适合使用“继承”特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继 ...
- 扩展方法(C#)
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 下面的示例为String添加 ...
- 扩展方法解决LinqToSql Contains超过2100行报错问题
1.扩展方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...
- C#扩展方法
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法就相当于一个马甲,给一个现有类套上,就可以为这个类添加其他方法了. 马甲必须定义为stati ...
- 枚举扩展方法获取枚举Description
枚举扩展方法 /// <summary> /// 扩展方法,获得枚举的Description /// </summary> /// <param name="v ...
- 扩展方法 1 简单的string扩展方法
这里是关于 String的简单扩展方法 (静态类 静态方法 this 类型 这里是string) static class Program { static void Main(string[] ar ...
- C#中的扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...
随机推荐
- Hibernate的many-to-many双向关联的配置办法
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibern ...
- filter_input() 函数
定义和用法 filter_input() 函数从脚本外部获取输入,并进行过滤. 本函数用于对来自非安全来源的变量进行验证,比如用户的输入. 本函数可从各种来源获取输入: INPUT_GET INPUT ...
- IOS7 SDK 几宗罪
IOS7 app 默认是全屏模式,所以之前的程序窗口会上向移动到状态栏上面,所以在底边会有一条大白边 表格单元格,默认是白色背景,之前程序设置的透明效果,这里不在起作用,需要用下面的委托方法改变.- ...
- 《JavaScript模式》第4章 函数
@by Ruth92(转载请注明出处) 第4章:函数 一.JavaScript 中函数的两个重要特征 函数是第一类对象,可以作为带有属性和方法的值以及参数进行传递: 函数提供了局部作用域,而其他大括号 ...
- JSP 数据库连接类 MySql数据库
数据库连接类的主要功能是连接数据库并且获得连接对象,以及关闭数据库.通过创建该类的实例,调用其中的方法,以避免重复操作. package chapter13; import java.sql.*; p ...
- 如何在 Linux 终端中知道你的公有 IP
导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...
- s查找父节点
查找所有的父节点,包括本身,不包括就<>id with tbs as(select * from TB_HomeBase where ID=223 union all select a.* ...
- Oracle学习笔记(一)
1.常用sqlplus命令 (1)查看当前登录用户:show user; (2)切换当前登录用户:conn 用户名/密码 (切换系统用户+as sysdba ); (3)断开当前登录用户:disc; ...
- gridview的行选择的一个问题
我想实现这样一个效果:单击gridview的行内任意地方都可以选择该行(就是行内复选框被选中),同时修改该行的背景色.当再次单击行内任意地方又可以取消选择.另外,当单击选择行内复选框时,我希望可以选择 ...
- ERROR 1130 (HY000):Host'localhost'解决方法
http://www.2cto.com/database/201211/169504.html ERROR 1130 (HY000):Host'localhost'解决方法 ERROR 1130 ...