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

    static class Extensions
    {
        public static Dummy<T> Where<T>(this Dummy<T> dummy,
                                        Func<T,bool> predicate)
        {//声明where扩展方法
//predicate	 {Method = {Boolean <Main>b__1(System.String)}}	System.Func<string,bool>
 			
            Console.WriteLine("Where called");
            return dummy;
        }
    }

    class Dummy<T>
    {
        public Dummy<U> Select<U>(Func<T,U> selector)
        {//selector	{Method = {System.String <Main>b__0(System.String)}}	System.Func<string,string>
//声明Select实例方法
            Console.WriteLine("Select called");
            return new Dummy<U>();
        }
    }

    class TranslationExample
    {
        static void Main()
        {
            var source = new Dummy<string>();
//source Queries.Dummy<string>  调用Dummy Where
//创建用于查询的数据源
            var query = from dummy in source
                        where dummy.ToString()=="Ignored"
                        select "Anything";
			//Queries.Dummy<string>
			//通过查询表达式来调用方法
        }		
    }


查询表达式已经被转译成

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


输出
Where called
Select called


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值