深入理解 c# 第十一章 dummy LINQ实现的调用方法的编译转换

    static class Extensions
    {
        public static Dummy Where(this Dummy dummy,
                                        Func predicate)
        {//声明where扩展方法
//predicate	 {Method = {Boolean 
b__1(System.String)}} System.Func Console.WriteLine("Where called"); return dummy; } } class Dummy { public Dummy Select(Func selector) {//selector {Method = {System.String
b__0(System.String)}} System.Func //声明Select实例方法 Console.WriteLine("Select called"); return new Dummy(); } } class TranslationExample { static void Main() { var source = new Dummy(); //source Queries.Dummy 调用Dummy Where //创建用于查询的数据源 var query = from dummy in source where dummy.ToString()=="Ignored" select "Anything"; //Queries.Dummy //通过查询表达式来调用方法 } }


查询表达式已经被转译成

var query = source.Where(dummy => dummy.ToString() == "Ignored")
							.Select(dummy => "Anything");
Dummy中没有实现IEnumerable。从查询表达式到"普通"代码转换
并不依赖于它,实际上几乎所有LINQ提供器都把数据显示为IEnumerable
或IQueryable。转译不依赖于任何特定类型而仅仅依赖与方法名称和参数。
  转译发生在编译过程初期,以便让编译器来挑选实例方法或者扩展方法。可以认为,
转译是在一个独立的预处理引擎中工作。


输出
Where called
Select called


你可能感兴趣的:(深入理解 c# 第十一章 dummy LINQ实现的调用方法的编译转换)