先写一段代码,让大家了解或重温一下什么是链式编程: - ///
- /// EntityFramwork中的链式编程示例
- ///
- private void Example1()
- {
- using (NorthwindEFEntities northwindEFEntities = new NorthwindEFEntities())
- {
- northwindEFEntities.Employees
- .Where(e => e.FirstName.StartsWith('C'))
- .Select(e => e.FirstName)
- .OrderBy(s => s);
- }
- }
/// /// EntityFramwork中的链式编程示例 /// private void Example1() { using (NorthwindEFEntities northwindEFEntities = new NorthwindEFEntities()) { northwindEFEntities.Employees .Where(e => e.FirstName.StartsWith('C')) .Select(e => e.FirstName) .OrderBy(s => s); } } 这一个基本的查询,执行了三个操作:1.查找FristName以C开头的员工;2.取员工的FirstName;3.将名字排序。 EF中只需要一个语句,通过.将三者链成一个语句。后面还可以链接更多的语句,如果需要。 下面代码作一些演化: - ///
- /// 链式编程示例2
- ///
- private static void Example2()
- {
- Person person = new Person { Name = 'Tom' }
- .Run()
- .Sing()
- .Swim();
- }
-
- class Person
- {
- public string Name { get; set; }
-
- public Person Run()
- {
- Console.WriteLine('Run');
- return this;
- }
- public Person Swim()
- {
- Console.WriteLine('Swim');
- return this;
- }
- public Person Sing()
- {
- Console.WriteLine('Sing');
- return this;
- }
- }
/// /// 链式编程示例2 /// private static void Example2() { Person person = new Person { Name = 'Tom' } .Run() .Sing() .Swim(); } class Person { public string Name { get; set; } public Person Run() { Console.WriteLine('Run'); return this; } public Person Swim() { Console.WriteLine('Swim'); return this; } public Person Sing() { Console.WriteLine('Sing'); return this; } } 这段代码定义了Peoson类,有三个操作Run、Swim、Sing,操作完成后返回自身this(有返回值是链式编程的关键)。返回自身this好比说执行完操作先别走人,还(可能)有其它操作要去做,如Example2中:先造一个People,先命令ta跑步,跑完先别休息再唱歌,再游泳,游泳完OK了。 链式编程是将多个操作(多行代码)通过点号'.'链接在一起成为一句代码。(定义不严密,表达能力好的请给修正一下) 以下为常规代码与链式代码的比较: - ///
- /// 链式编程示例3 对比
- ///
- private void Example3()
- {
- //链式代码
- Person person = new Person { Name = 'Tom' }
- .Run()
- .Sing()
- .Swim()
- .Run()
- .Sing()
- .Swim();
- //常规代码
- Person person2 = new Person();
- person2.Run();
- person2.Sing();
- person2.Swim();
- person2.Run();
- person2.Sing();
- person2.Swim();
- }
/// /// 链式编程示例3 对比 /// private void Example3() { //链式代码 Person person = new Person { Name = 'Tom' } .Run() .Sing() .Swim() .Run() .Sing() .Swim(); //常规代码 Person person2 = new Person(); person2.Run(); person2.Sing(); person2.Swim(); person2.Run(); person2.Sing(); person2.Swim(); } 为了增强效果,都执行了两轮操作。个人感觉链式代码更加精炼简洁易读。
链式代码要求操作有返回值,但对于很多操作大都是void型,什么也不返回,这样就很难链起来了。当然也有解决办法,可能不太优雅。 本人使用扩展方法解决这个问题,首先引入一个泛型扩展:
- ///
- /// 先执行操作,再返回自身
- ///
- public static T Do(this T t, Action action)
- {
- action(t);
- return t;
- }
/// /// 先执行操作,再返回自身 /// public static T Do(this T t, Action action) { action(t); return t; } 下面是调用示例,其中Student类操作都是void型的。 - ///
- /// 链式编程示例4
- ///
- private static void Example4()
- {
- new Student { Name = 'Tom' }
- .Do(s => s.Run())
- .Do(s => s.Sing())
- .Do(s => s.Sing())
- .Do(s => s.Name = 'Bob');
- }
-
- public class Student
- {
- public string Name { get; set; }
- public void Run() { Console.WriteLine('Run'); }
- public void Swim() { Console.WriteLine('Swim'); }
- public void Sing() { Console.WriteLine('Sing'); }
- }
/// /// 链式编程示例4 /// private static void Example4() { new Student { Name = 'Tom' } .Do(s => s.Run()) .Do(s => s.Sing()) .Do(s => s.Sing()) .Do(s => s.Name = 'Bob'); } public class Student { public string Name { get; set; } public void Run() { Console.WriteLine('Run'); } public void Swim() { Console.WriteLine('Swim'); } public void Sing() { Console.WriteLine('Sing'); } }
|