再谈.NET委托(delegate、Func<>)
为了演示委托,我们先来定义一个方法:
public static bool IsTen(int i)
{
return i == 10 ? true : false;
}
如果要用自定义委托,则需要声明:
delegate bool IsTenDelegate(int i);
示例一:
//这是最基本的写法
IsTenDelegate d = new IsTenDelegate(IsTen);
Console.WriteLine(d(10)); //true
示例二:
//自定义匿名委托
IsTenDelegate d = delegate(int i) { return i == 10 ? true : false; };
Console.WriteLine(d(10)); //true
示例三:
//或者使用系统现有的委托Func<>,结合lambda表达式
Func<int, bool> d = p => p == 10 ? true : false;
Console.WriteLine(d(10)); //true
示例四:
//或者也可以这么写
Func<int, bool> d = delegate(int i) { return i == 10 ? true : false; };
Console.WriteLine(d(10)); //true
-------------- 高端大气上档次的分割线 --------------------
下面我们来看一个Func<>委托的实际应用场景:
//假设有一个Model
public class TModel
{
public int ID { get; set; }
public string Name { get; set; }
public List<string> Friends { get; set; }
}
//提供一个处理单个Model数据的方法模板,返回方法集合
public static List<Func<TModel, object, object>> DataConver()
{
List<Func<TModel, object, object>> list = new List<Func<TModel, object, object>>();
list.Add((t, p) => t.ID = (int)p);
list.Add((t, p) => t.Name = p.ToString());
return list;
}
//利用方法集合处理数据,并返回结果数据
//此方法为一个泛型方法,接受类型参数T
public static List<T> GetData<T>(List<Func<T, object, object>> dataMaker) where T:class,new()
{
List<T> lst = new List<T>();
T t = new T();
for (int i = 0; i < dataMaker.Count; i++)
{
//因为dataMaker是方法集合,而每个方法都负责处理T中的一个成员,
//这里假设所有方法的第二个参数都是123,
//具体应用场景应该是根据T对应的成员类型做不同的转换。
dataMaker[i](t, 123);
}
lst.Add(t);
return lst;
}
//调用
List<TModel> list = GetData<TModel>(DataConver());
再谈.NET委托(delegate、Func<>)的更多相关文章
- 再谈C#委托与事件
之前写过一篇关于C#委托与事件的文章(见<C#委托和事件例析>),不过还是收到一些网友的提问.所以,今天再换另一个角度来详解一下这个问题. 一.在控制台下使用委托和事件 我们都知道,C#中 ...
- C#常见委托のdelegate定义,Func,Action,Predicate总结
委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...
- C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别
以前一直迷迷糊糊的,现在总算搞明白. Lambda表达式 Lamda表达式基本写法是()=>{ };Lambda和方法一样都可以传入参数和拥有返回值.(int x)=>{return x; ...
- 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解
1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...
- C# 委托应用总结(委托,Delegate,Action,Func,predicate)
C# 委托应用总结 一.什么是委托 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执 ...
- C#基础知识六之委托(delegate、Action、Func、predicate)
1. 什么是委托 官方解释 委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法. 个人理解 委托通俗一点说就是把一件事情交给别人来帮助完 ...
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
stackoverflow上有人问,为什么不能把委托放在一个接口当中? 投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't g ...
- 委托(Func与Action)
1.平时我们如果要用到委托一般都是先声明一个委托类型,比如: private delegate string Say(); string说明适用于这个委托的方法的返回类型是string类型,委托名Sa ...
- C# 委托(delegate)、泛型委托和Lambda表达式
目录 # 什么是委托 # 委托声明.实例化和调用 1.声明 2.委托的实例化 3.委托实例的调用 4.委托完整的简单示例 #泛型委托 1.Func委托 2.Action委托 3.Predicate委托 ...
随机推荐
- webdriver报不可见元素异常方法总结
最近一直在学Selenium相关东西,学到webdriver这块,出现报不可见元素异常方法异常,后来网上找了好多相关资料都没搞定,也没看明白,最后发现是xpath中写了calss属性有问题.现在把学习 ...
- Tomcat日志监控工具——Probe
今天遇到项目运行过程中需要查看用户访问日志,log4j.properties配置好,将log日志输出到tomcat的log文件夹下,但不可能每次都去服务器上拉取log文件查看,网上找了下,发现一个日志 ...
- osg HUD 背景图片设置
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...
- PostgreSQL学习笔记——内置函数
算术函数(数值计算) +(加).-(减).*(乘)./(除) ABS函数--绝对值: ABS(数值) MOD--求余: MOD(被除数,除数) ROUND--四舍五入: ROUND(对象数值,保留小数 ...
- 【Leetcode_easy】744. Find Smallest Letter Greater Than Target
problem 744. Find Smallest Letter Greater Than Target 题意:一堆有序的字母,然后又给了一个target字母,让求字母数组中第一个大于target的 ...
- ELK之elasticsearch7版本集群设置
ELK7版本搭建参考:https://www.cnblogs.com/minseo/p/10948632.html node-1已经安装配置好 配置文件如下 [root@salt-test conf. ...
- Windows VS2017 编译 libssh2 1.7.0(执行命令、文件上传、下载)
下载安装 OpenSSL 要编译 libssh2,必须先编译好 OpenSSL 的静态库,直接从 http://slproweb.com/products/Win32OpenSSL.html 下载已经 ...
- web 中常用的两种上传文件的方法总结
这里我们来总结整理一下常用的两种文件上传方式以及要注意的东西: 1.springmvc .MultipartFile 的上传方式. 2.org.apache.commons.fileupload 使用 ...
- Memcached集群实现及原理介绍
一.Memcached集群介绍 1.自身通过算法保证数据唯一性2.集群形式对用户和Memcached都是透明的3.Memcached的集群是通过客户端实现的4.Memcached服务端相互不认识 二. ...
- mysql每次update数据,自动更新对应表中时间字段
mysql 已经创建完成表的情况下, 使得其中的时间字段 在每次 uodate 数据的时候 自动更新事件, 运行如下sql ALTER TABLE tab_name MODIFY COLUMN upd ...