在开发中,如果有特殊需求,我们可以自定义.NET中方法的扩展方法,小编遇到一个情况,在一个老的项目中不能引用linq,但是我们需要用到Lambda表达式中的方法,那么我们就需要自定义扩展方法;还有一种情况是我们只用到Lambda很少的一部分功能那么也可以自定义扩展方法,比如where方法。 下面以where为例我们具体来看看怎么自定义,顺便看看他们的原理。.
一、数据准备
我们准备一个类并且模拟数据
//这里是客户类public class Customer{public int id { get; set; }public string name { get; set; }public string email { get; set; }public int age { get; set; }}//并赋值public static List<Customer> GetCustomer(){List<Customer> list = new List<Customer>();list.Add(new Customer { id = 1, name = "刘德华", age = 56, email = "ldh@net.cn" });list.Add(new Customer { id = 2, name = "张学友", age = 52, email = "zxy@net.cn" });list.Add(new Customer { id = 3, name = "黎明", age = 58, email = "lm@net.cn" });list.Add(new Customer { id = 4, name = "郭富城", age = 60, email = "gfc@net.cn" });list.Add(new Customer { id = 5, name = "古天乐", age = 55, email = "gtl@net.cn" });return list;}
List<Customer> list = new List<Customer>();foreach (var item in GetCustomer()){if(item.age>55){list.Add(item);}}
public static class Self{public static IEnumerable<T> SelfWhere<T>(this IEnumerable<T> lists, Func<T, bool> func){foreach (var t in lists){if (func.Invoke(t)){yield return t;//yield关键字遍历一次返回一次}}}}
三、调用扩展方法
调用扩展方法跟调用原生where方法一样,如下
static void Main(string[] args){//这个是调用扩展方法var cuList= GetCustomer().SelfWhere(w => w.age > 55);//原生的where方法var cuList3 = GetCustomer().Where(w => w.age > 55);foreach (var item in test){Console.WriteLine(item.name);}}//都输出:刘德华,黎明,郭富城
这里我们用反编译三个方法的调用,如下:

从上可以看出,原生的where调用的也是委托Func,几乎跟我们写的一样。原理其实就是委托。
结语
本文讲述了where扩展方法的使用,以及它的基本原理。其他的方法大家也可以尝试尝试扩展方法。写作水平有限,希望本文对大家学习和工作有一定参考价值,谢谢大家的支持。