在开发中,如果有特殊需求,我们可以自定义.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扩展方法的使用,以及它的基本原理。其他的方法大家也可以尝试尝试扩展方法。写作水平有限,希望本文对大家学习和工作有一定参考价值,谢谢大家的支持。