c#中的扩展方法学习笔记
作者:alone_alone 发布时间:2023-04-11 10:29:15
前言
最近在看王清培前辈的.NET框架设计时,当中有提到扩展方法 .
开头的一句话是:扩展方法是让我们在不改变类原有代码的情况下动态地添加方法的方式,这给面向对象设计 模块设计带来了质的提升
很明显,扩展方法在框架设计或者平时码代码中,是能够提升我们整个架构的灵活性的
简介
扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 扩展方法当然不能破坏面向对象封装的概念,所以只能是访问所扩展类的public成员。
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
C#扩展方法第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。
扩展方法的目的就是为一个现有类型添加一个方法,现有类型既可以是int,string等数据类型,也可以是自定义的数据类型。
一..net自带扩展方法和自定义扩展方法
在使用linq时就能够使用到很多.net自带的扩展方法,比如where select等等
where的扩展方法定义
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
Select的扩展方法定义
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
(1)自己实现where和select的扩展方法
// where自实现
public static IEnumerable<TSource> ExtenSionWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw new Exception(nameof(source));
}
if (predicate == null)
{
throw new Exception(nameof(predicate));
}
List<TSource> satisfySource = new List<TSource>();
foreach (var sou in source)
{
if (predicate(sou))
{
satisfySource.Add(sou);
}
}
return satisfySource;
}
// select 自实现
public static IEnumerable<TResult> ExtenSionSelect<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
if(source==null)
{
throw new Exception(nameof(source));
}
if(selector==null)
{
throw new Exception(nameof(source));
}
List<TResult> resultList = new List<TResult>();
foreach(var sou in source)
{
resultList.Add(selector(sou));
}
return resultList;
}
(2)自实现where和select调用
static void Main(string[] args)
{
List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6 };
//常规写法
var selectList = list.ExtenSionWhere(p => p > 3).ExtenSionSelect(p => p.ToString()).ToList();
//自定义泛型委托写法
Func<int, bool> whereFunc = (num) => num > 3;
Func<int, string> selectFunc = (num) => num.ToString();
var selectList1 = list.ExtenSionWhere(p => whereFunc(p)).ExtenSionSelect(p => selectFunc(p)).ToList();
}
二.使用扩展方法实现链式编程
我在项目中经常使用开源的Flurl进行http请求,在进行拼装请求报文时,就会使用到链式编程
如下代码所示
以上代码就是使用了扩展方法进行链式编程,从而使得整个请求信息可以在一句代码中体现出来
接下来,我们自己实现链式代码
public static class ContextExtension
{
public static RectangleContext SetLength(this RectangleContext context,int num)
{
RectangleContext.Config.Length = num;
return context;
}
public static RectangleContext SetWideth(this RectangleContext context, int num)
{
RectangleContext.Config.Wideth = num;
return context;
}
public static RectangleContext SetHeight(this RectangleContext context, int num)
{
RectangleContext.Config.Height = num;
return context;
}
}
public class RectangleContext
{
public static RectangleContext Config=new RectangleContext();
public int Length { get; set; }
public int Wideth { get; set; }
public int Height { get; set; }
}
调用和执行结果
总结
1.使用扩展方法能在不修改原有类型的基础下,动态添加方法,这使得整个框架更具有灵活性
2.在使用上下文信息的时候,可以使用链式编程,使得调用时能够在一句代码中完成所有属性设置
3.扩展方法不能滥用.添加扩展方法应当使用最小影响原则,即尽量不要在父类使用扩展方法,比如object,这将影响性能
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
来源:http://www.cnblogs.com/xxue/p/9892252.html
猜你喜欢
- java8 Stream list to Map key 重复 value合并到Collectio关于把list转换成key value的m
- import java.io.FileNotFoundException;import java.io.FileOutputStream;i
- 概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关
- 1.通过UnityHub安装unityUnityHub下载路径,UnityHub安装按照步骤来就可以了。打开UnityHub,点安装。3.选
- 这篇文章主要介绍了Java获取时间打印到控制台代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一、扫雷扫雷小游戏主要是利用字符数组、循环语句和函数实现。设计思路:雷盘大小为9*9,但是为了后续能更好的统计出雷的个数在定义数组的时候定义
- 方法有4种:使用 String 类的 valueOf() 方法使用字符串连接使用 Character 类的 toString() 方法使用字
- 本文实例讲述了java GUI编程之监听操作。分享给大家供大家参考,具体如下:当点击Frame中的component组件时,会产生相应的效果
- JAVA是面向对象的语言,开发者在操作数据的时候,通常更习惯面对一个特定类型的对象,如一个用户就是一个User类的对象。DAO层需要做的,就
- 在Java编程过程中,我们常常会遇到比较基本类型或者对象之间的大小关系,下面我们来看看怎么去比较。源码如下:package object;c
- 目录Directory:创建文件夹删除文件夹获取文件夹下的子文件夹获取同类型的文件判断文件夹是否存在移动文件夹总结之前发过File对文件的操
- 一、什么是并查集对于一种数据结构,肯定是有自己的应用场景和特性,那么并查集是处理什么问题的呢?并查集是一种树型的数据结构,用于处理一些不相交
- 文章描述这个效果可能很多人都在抖音看到过,即把一个短视频,转成数字、字母等乱码组成的形式进行播放。开发环境.NET Framework版本:
- 有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有
- 前言在创建表格时,如果表格内容出现跨页显示的时候,默认情况下该表格的表头不会在下一页显示,在阅读体验上不是很好。下面分享一个方法如何在表格跨
- 在开发中,我们会遇到将不同组织架构合并成tree这种树状结构,那么如果做呢?实际上,我们也可以理解为如何将拥有父子关系的list转成树形结构
- 前言在开发过程中,使用模板引擎是很有必要的。jsp已经明显跟不上时代发展了,freemarker用的够够的?换thymeleaf试试吧。sp
- 本文实例讲述了基于C#实现XML文件读取工具类。分享给大家供大家参考。具体如下:这是我去年写的一个XML文件读取工具类,现在做了一些调整 基
- The java.io.Writer.flush() method flushes the stream. If the stream ha
- spring事务注解@Transactional与trycatch在项目中 @service层中 我们会经常在做一些增删改操作的方法上看到