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#代理那点事儿的更多相关文章

  1. 设计模式-代理模式(Proxy Model)

    文 / vincentzh 原文连接:http://www.cnblogs.com/vincentzh/p/5988145.html 目录 1.写在前面 2.概述 3.目的 4.结构组成 5.实现 5 ...

  2. 【原创】JDK动态代理,此次之后,永生难忘。

    动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不 ...

  3. JDK动态代理,此次之后,永生难忘

    出自:http://www.cnblogs.com/dreamroute/p/5273888.html#3839242 首先感谢"神一样的存在"的文章! 动态代理,这个词在Java ...

  4. springIOC的那些事

       springIOC动态代理的那些事儿 1.发现问题 今天在使用spring的IOC容器时发现了这样的一个问题: 首先有一个接口定义如下: public interface BookShopSer ...

  5. PHP-客户端的IP地址伪造、CDN、反向代理、获取的那些事儿

    外界流传的JAVA/PHP服务器端获取客户端IP都是这么取的: 伪代码: 1)ip = request.getHeader("X-FORWARDED-FOR")     可伪造,参 ...

  6. 关于Java代理那些事儿

    代理是啥?就是代替你执行你持有的主要功能,并且能在你的基础之上完成一些其他的功能.代理的目的就是生成一个和原对象具有同样功能的对象.在Java中,代理是一种设计模式.在Spring的面向切面编程(AO ...

  7. webpack 教程 那些事儿04-webpack项目实战分析

    这节主要讲解真正项目用用到的 webpack配置问题,项目实战篇 就像我们不会完全做一个项目,不用别人的轮子一样.这个配置我们借用 vue-cli 搭建的配置来研究,因为它已经足够优秀. 有了前面的基 ...

  8. 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理

    豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...

  9. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

随机推荐

  1. 【Python之路Day12】网络篇之Paramiko

    paramiko模块,基于SSH用于连接远程服务器并执行相关操作. 一.安装 pip3 install paramiko 二.使用 1. SSHClient 用于连接远程服务器并执行基本命令 基于用户 ...

  2. Attribute和Property

    有时很容易对Attribute和Property混淆,因为中文翻译都是“属性”来解释的.其实这两个表达的不是一个层面的东西. Property属于面向对象理论范畴,在使用面向对象思想编程的时候,常常需 ...

  3. Android UI开发【开篇导航】

    如今移动互联网正处于飞速发展的时期,正式看中这个行业的发展势头,本人在2011年从.NET转行做了移动应用开发这块,接触了android和ios开发,到今已快3个年头,先前忙于学习各种基础知识和语法方 ...

  4. WEB项目后端跨域请求

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...

  5. 应用SQLServer For XML 生成XML避免在C# 拼字符串

    最近在Review代码时,有一个功能是 查询数据库中一列,然后生成像 <rootelements>      <col>a</col>      <col&g ...

  6. [JS6] 通过用户事件事件执行脚本

    <html> <head> <title>通过用户事件事件执行脚本</title> <SCRIPT TYPE="text/JavaScr ...

  7. Linux:常用快捷键

    按键 作用 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相 ...

  8. [BTS] BizTalk With EF

    System.TypeInitializationException: The type initializer for 'System.Data.Entity.Internal.AppConfig' ...

  9. C#课外实践——校园二手平台(技术篇1)

    前面分享了这次的课外实践的心得,这次,就分享一下从这次的课外实践的过程中学到的知识技能吧.虽然有句话说的好,不要做没有准备的战争,但是,我想说的是,生活中有很多的事情是不允许我们有准备的.遇到事情必须 ...

  10. crossplatform---Nodejs in Visual Studio Code 10.IISNode

    1.开始 Nodejs in Visual Studio Code 08.IIS : http://www.cnblogs.com/mengkzhaoyun/p/5410185.html 参考此篇内容 ...