扩展方法(Extension Method)

MSDN定义:能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

扩展方法须知: 1、扩展方法声明所在的类必须被声明为static

2、扩展方法必须被声明为static

3、扩展方法必须包含this关键字作为它的第一个参数类型,并后跟所扩展的类的名称

创建扩展方法

//通过扩展方法 创建一个类似List FindAll方法
namespace Blog_ExtensonMethod
{
//静态类
public static class ExtensionMethods
{ //声明一个委托(本次不是重点,后面介绍委托和事件)
public delegate bool MyCalcDelegate<in T>(T obj);
//静态方法
//第一版本
public static List<T> ScreenValueList<T>(this List<T> list, MyCalcDelegate<T> myCalc) //this关键字 后跟类型
{
List<T> reslut = new List<T>();
foreach (var item in list)
{
if (myCalc(item))
{
reslut.Add(item);
}
}
return reslut;
}
//第二版本
public static List<T> ScreenValue<T>(this List<T> list, Func<T, bool> whereLambda)
{
return list.Where(whereLambda).ToList();
}
}
}
namespace Blog_ExtensonMethod
{
class Program
{
static void Main(string[] args)
{
//list初始化数据
List<int> list = new List<int>();
for (int i = 0; i < 100; i++)
{
list.Add(i);
} //ScreenValueList(筛选数据)创建步骤
//1.创建扩展方法(静态类、静态方法、this关键字+类型)
//1.1 创建一个委托(委托可以简单理解将方法像参数一样可以进行传递)
//2.方法内 创建一个新的泛型List
//3.方法内 将MyCalc方法(判断list中的单个值是否大于50,如果大于就添加到新的泛型List中)
//4.方法内 将新的泛型List返回 //第一版本
var temp = list.ScreenValueList(MyCalc); //将MyCalc方法传入ScreenValueList方法中返回List循环打印
foreach (var item in temp)
{
Console.WriteLine(item);
} Console.WriteLine("======================="); //第二版本 和FindAll差不多了
var tmp = list.ScreenValue(i => i > 50);
foreach (var item in tmp)
{
Console.WriteLine(item);
}
Console.ReadKey();
} public static bool MyCalc(int val)
{
return val > 50;
}
}
}                               

其实很多的时候我们都在用扩展方法,只是没认真注意,如Linq中的方法,Where、OrderBy等,犹如MVC中HtmlHelper添加符合我们方法,那绝对是堪比服务端控件的利器,而又没有viewstate!

扩展方法其实只要记得三要素:静态类、静态方法、this关键字

脚踏实地学C#5-扩展方法的更多相关文章

  1. 脚踏实地学C#2-引用类型和值类型

    引用类型和值类型介绍 CLR支持两种类型,引用类型和值类型两种基本的类型: 值类型下有int.double.枚举等类型同时也可以称为结构,如int结构类型.double结构类型,所有的值类型都是隐式密 ...

  2. 脚踏实地学C#4-静态类

    起因 问:静态类可以实现接口及继承? 答:都不可以 思考:为什么不可以呢? 学习 静态类,有时我们又称为工具类(密封抽象类),从MSDN文档没有直接静态类的定义,这里只能说用static(不能用于结构 ...

  3. 脚踏实地学C#3-装箱和拆箱

    装箱:一种接受值类型的值,根据这个值在堆中创建一个完整的引用类型对象并返回对象的引用(堆地址)的隐式转换 int i_number = 2; //在栈中声明int类型i_Number变量并初始化 ob ...

  4. 脚踏实地学C#1-基元类型

    基元类型:编译器直接支持的数据类型 基元类型直接映射到FCL类库上,如int 和Int32是等价的,只不过是int是c#提供的,Int32是FCL类库提供的. int只是Int32的别名 using ...

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

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

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

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

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

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

  8. C#的扩展方法解析

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

  9. 扩展方法(C#)

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

随机推荐

  1. Revolving Digits

    题面 [题目描述]: 有一天,Silence对可以旋转的正整数十分感兴趣.在旋转操作中,他可以把后面的数字按照原位置不动地搬到剩下位置的前面.当然,他也可以完全不动这串数字.比如,他可以把123变为1 ...

  2. debug : 调试主进程启动的子进程

    http://blog.csdn.net/lostspeed/article/details/10109867

  3. 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”

    首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. 通常,在模块的头文件中对本模块提供给其它模块 ...

  4. Smart3D系列教程8之 《模型合并——相邻地区多次建模结果合并》

    迄今为止,Wish3D已经出品推出了7篇系列教程,从倾斜摄影的原理方法.采集照片的技巧.Smart3D各模块的功能应用.小物件的照片重建.大区域的地形重建到DSM及正射影像的处理生产,立足于建模软件的 ...

  5. VS2012+Win7站点公布具体步骤

    VS2012+Win7站点公布详细步骤 本机环境: 本文分三个部分介绍Web项目公布的常规方法,大神级别能够略过,主要是为了方便一些刚開始学习的人. 第一部分:VS2012把项目公布到文件系统. 第二 ...

  6. shell-判断循环

    shell条件测试 test 每个完整的合理的编程语言都具有条件判断的功能. bash可以使用test命令,[]和()操作,还有if/then结构 字符串判断 -n string 判断字符串长度非零 ...

  7. 5分钟部署filebeat + ELK 5.1.1

    标题有点噱头,不过网络环境好的情况下也差不多了^_^   1. 首先保证安装了jdk.   elasticsearch, logstash, kibana,filebeat都可以通过yum安装,这里前 ...

  8. 通过路由管理视图间切换 - AngularJS路由解析

    模板的视图刷新 ng-view这个指令和路由组合之后就可以将$route对应的视图放入指定的HTML中,这一过程中它会创建自己的作用域并将模板嵌套在内部. ng-view指令的优先级是1000(终极) ...

  9. nginx 安装和配置文件说明

    1. 安装依赖包 yum install gcc gcc+ yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel 2 ...

  10. Nmap扫描教程之基础扫描具体解释

    Nmap扫描教程之基础扫描具体解释 Nmap扫描基础扫描 当用户对Nmap工具了解后,就可以使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具能够分别对主机.port.版本号.操作系统等实施扫 ...