扩展方法(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关键字

最新文章

  1. url传参中文乱码
  2. centos 6.7安装与配置vncserver
  3. 从语言到库到框架,再到API,再到标记最后到DSL语言
  4. Linux(CentOS)系统下设置nginx开机自启动
  5. 使用WITH AS提高性能简化嵌套SQL(转)
  6. HDU 5794:A Simple Chess(Lucas + DP)
  7. Javascript中的Bind 、Call和Apply
  8. JS控制图片拖动 放大 缩小 旋转 支持滚轮放大缩小 IE有效
  9. (转)单机上配置hadoop
  10. HDU 5963 朋友 【博弈论】 (2016年中国大学生程序设计竞赛(合肥))
  11. MySQL之pymysql模块
  12. hive的join
  13. Kubernetes中资源配额管理
  14. vue中使用全局函数
  15. C#操作数据表中XML格式的数据
  16. js eventLoop (使用chunk 同步变异步)
  17. 【spark】jieba + wordcount
  18. 惠普(HP)战66 Pro G1 - 批量GHOST[Win10专业版 ] (UEFI)
  19. 实验三— —敏捷开发与XP实践
  20. [CSS3]Clearfix

热门文章

  1. Java-多态的理解(主要是解释一个网上经典的例子)
  2. sublime text 3和sublime text 2的 package control 插件 代码
  3. svn hooks 实现自动更新
  4. Redis Sentinel 情况下bind地址设置
  5. 改进后的向量空间模型(VSM)
  6. Spring &lt;context:annotation-config&gt; 和 &lt;context:component-scan&gt;区别
  7. C语言-回溯例4
  8. Android - Activity定制横屏(landscape)显示
  9. leetcode第一刷_Permutation Sequence
  10. ZYThumbnailTableView---堪比一个小型阅读App