C#代理那点事儿
Func代理是啥?
Func代理接收0个或多个参数,返回TResult值;
以Func<TSource, TResult>为例:Func带来封装一个方法,该方法接收一个参数,然会一个TResult类型。
举个最简单的例子,求一个一维整数数组的和
private static void Demo()
{
Func<int[], int> MySum = arr =>
{
int total = ;
foreach (int i in arr)
total += i; return total;
}; int[] data = new int[] { , , , , , , , , , };
int result = MySum(data); Console.WriteLine(result);
}
Sum
OK,我们继续,如果我们希望复杂一点:先对数组过滤,然后求和,那么我们的代码应该如下:
private static void Demo3()
{ int[] data = new int[] { , , , , , , , , , };
int result = data.FilterAndSum(a => a > ); Console.WriteLine(result);
} public static class MyExtension
{
public static int FilterAndSum(this int[] source, Func<int, bool> selector)
{
int total = ;
foreach (int s in source)
if (selector(s))
total += s; return total;
}
}
FilterAndSum
如果,我们希望我们的扩展方法,可以支持更改多的类型,那么我们可以这样的实现扩展方法
public static int SelectAndSum<TSource>(this IList<TSource> source, Func<TSource, int> selector)
{
int total = ; foreach (TSource s in source)
total += selector(s); return total;
} ...... private static void Demo()
{
IList<Staff> list = new List<Staff> {
new Staff{FirstName="AAA", LastName="", Salary=},
new Staff{FirstName="BBB", LastName="", Salary=}
};
int result = list.SelectAndSum(s => s.Salary); Console.WriteLine(result);
}
Generic Extend method
另外,如果我们想自己扩展IEnumerable,那么现在我们就知道应该这样:
public static IEnumerable<TSource> CustomMethod<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> selector)
{
foreach(TSource s in source)
if(selector(s))
yield return s;
}
... private static void Demo4()
{
IList<Staff> list = new List<Staff> {
new Staff{FirstName="Tom", LastName="Ng", Salary=},
new Staff{FirstName="Simon", LastName="Wong", Salary=}
}; IEnumerable<Staff> list2 = list.CustomMethod(s => s.Salary > ); Console.WriteLine(list2.Count());
}
Extend IEnumerable
那么Action代理呢
Action代理不返回值,它可以接受一个或多个参数。
那么Delegete类呢?
代理就是一个指向某个类的静态方法,或者指向实例类的实例方法。
那么代理呢?
代理是定义了方法签名的类型。当你实例化一个代理类型时,你可以把该代理实例指向与代理签名相兼容的方法。然后通过代理实例调用所指向的方法
C#代理那点事儿的更多相关文章
- 设计模式-代理模式(Proxy Model)
文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...
- 【原创】JDK动态代理,此次之后,永生难忘。
动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不 ...
- JDK动态代理,此次之后,永生难忘
出自:http://www.cnblogs.com/dreamroute/p/5273888.html#3839242 首先感谢"神一样的存在"的文章! 动态代理,这个词在Java ...
- springIOC的那些事
springIOC动态代理的那些事儿 1.发现问题 今天在使用spring的IOC容器时发现了这样的一个问题: 首先有一个接口定义如下: public interface BookShopSer ...
- PHP-客户端的IP地址伪造、CDN、反向代理、获取的那些事儿
外界流传的JAVA/PHP服务器端获取客户端IP都是这么取的: 伪代码: 1)ip = request.getHeader("X-FORWARDED-FOR") 可伪造,参 ...
- 关于Java代理那些事儿
代理是啥?就是代替你执行你持有的主要功能,并且能在你的基础之上完成一些其他的功能.代理的目的就是生成一个和原对象具有同样功能的对象.在Java中,代理是一种设计模式.在Spring的面向切面编程(AO ...
- webpack 教程 那些事儿04-webpack项目实战分析
这节主要讲解真正项目用用到的 webpack配置问题,项目实战篇 就像我们不会完全做一个项目,不用别人的轮子一样.这个配置我们借用 vue-cli 搭建的配置来研究,因为它已经足够优秀. 有了前面的基 ...
- 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理
豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...
- 豌豆夹Redis解决方案Codis源码剖析:Proxy代理
豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...
随机推荐
- 【leetcode】Linked List Cycle
这个题真是坑死了,只怪自己不好吧.一开始审题,以为是给定一个首尾相连的链表,查看其中是否有循环(原谅我的无知吧!!).然后在那写啊写啊写,还在纠结是局部循环还是前一半和后一半一样这样的循环,blah ...
- libqrencode 3.4.3 发布,二维码的C解析库
libqrencode 3.4.3 的命令行增加了 --rle 参数,修复了开发库和命令行工具的一些小 bug. libqrencode (QRencode) 是一个用C语言编写的用来解析二维条形码( ...
- TypeScript开篇:尝点新鲜和甜头
返回TS学习总目录 快速开始 我们通过创建一个简单的web应用来开始使用TypeScript.获得TS工具的方法主要有两种,一种是通过NPM(Node包管理器),另一种是通过VS2012安装TS的插件 ...
- Fragment之间的通信
在本节中,你会学到 1.定义接口 2.实现接口 3.将消息传递给fragment 为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让frag ...
- Android中px和dip的区别
在Android手机的诞生之初,由于Android系统是开源的,一开始便有众多的OEM厂商对Android手机进行深度定制,于是乎Android手机的皮肤和屏幕大小都变得百花齐放,这可苦逼了我们这群开 ...
- [ucgui] 对话框3——GUIBuilder生成界面c文件及修改
>_<" 其实生成GUI有相应的工具:
- JavaScript实用技巧总结
前言 总结一下最近接触到的JavaScript语法糖,与大家共享. 每块糖都有详细的说明和示例,就不多说了. 准确的类型检查 /* * @function: * 类型检查示例 * 通过此方法,可以检查 ...
- spring mvc ajax 400解决
The request sent by the client was syntactically incorrect. ajax发起请求时报400错误.请求代码如下: var reportId=($( ...
- Oracle中SQL的分类
DDL 数据定义语言: 用于创建(create).修改(alter)或删除(drop)数据库对象. DML 数据操作语言: 添加(insert into).修改(update)和删除(delete)表 ...
- Linux初学 - java环境安装
http://www.oracle.com/technetwork/java/javase/downloads/index.html 找到对应版本的jak的安装包 我这边下载的是64_rpm 下载完成 ...