本文我们开始Linq利用表达式树,并讨论比较有趣的内容,即如何实现Linq Func

淳安网站建设公司创新互联,淳安网站设计制作,有大型网站制作公司丰富经验。已为淳安上1000家提供企业网站建设服务。企业网站搭建\外贸网站建设要多少钱,请找那个售后服务好的淳安做网站的公司定做!
在Linq中,任何接收λ表达式(委托类型)的方法都可以转换为接收相同委托类型的Expression
- privatestaticvoid DoSomething(Predicate
 predicate) 
可以替换为:
- privatestaticvoid DoSomething(
 - Expression
 predicate) > 
在上述两种情况下,调用代码可以是相同的λ表达式:
- DoSomething(x => x.Value > 25);
 
这里发生的情况是,编译器不会将指针传入到第二个方法签名的匿名委托中,而是生成以表达式树的形式构建AST(抽象语法树)的IL代码。如果您打开Reflector(我的类型反射类的名字也由此而来,它是任何高级开发人员都应该经常使用的最伟大的工具)并取消对DoSomething的方法调用,就可以看到:
- ParameterExpression expression1 =
 - Expression.Parameter(typeof(Mock), "x");
 - Program.DoSomething(
 - Expression.Lambda
 > (- Expression.GT(Expression.Field(
 - expression1, fieldof(Mock.Value)),
 - Expression.Constant(0x19, typeof(int))),
 - newParameterExpression[]{expression1 })
 - );
 
这里您可以看到编译器如何使用Expression类上的静态方法构建整个表达式(我对API的详细看法另外单独讨论)。当然,在方法实现中,您可以检查相同的树并执行任何想执行的操作。***的Linq CTP包含一个非常酷的可视化工具,在运行时到达您的方法主体时可以用来查看表达式树中的情况。到现在为止,您应该明白了我正在实现一个强类型反射:我接收一个表达式树,并在其中搜索方法调用节点(或者,对于属性和字段来说是成员访问)。下面是Method<>方法的实现:
- publicstaticMethodInfo Method
 ( - Expression
 method) - {
 - return GetMethodInfo(method);
 - }
 - privatestaticMethodInfo GetMethodInfo(Expression method)
 - {
 - LambdaExpression lambda = method asLambdaExpression;
 - if (lambda == null)
 - thrownewArgumentNullException("method");
 - MethodCallExpression methodExpr = null;
 - // 我们的Operation
 返回一个对象,故首先可以声名一 - // 个类型转换(如果方法无返回对象)或直接方法调用。
 - if (lambda.Body.NodeType == ExpressionType.Cast)
 - {
 - // 类型转换是一个一元操作,而操作数是一个方法调用表达式。
 - methodExpr = ((UnaryExpression)lambda.Body).
 - Operand asMethodCallExpression;
 - }
 - elseif (lambda.Body.NodeType == ExpressionType.MethodCall ||
 - lambda.Body.NodeType == ExpressionType.MethodCallVirtual)
 - {
 - methodExpr = lambda.Body asMethodCallExpression;
 - }
 - if (methodExpr == null)
 - thrownewArgumentException("method");
 - return methodExpr.Method;
 - }
 
我创建的就是Operation委托类型。不能使用Linq Func
- publicdelegateobjectOperation();
 - publicdelegateobjectOperation
 (T declaringType); - publicdelegateobjectOperation(T declaringType, A0 arg0);
 - ...
 
注意,API的用户从来都不会知道这些委托类型的对象的存在,就像查询操作符的用户从不知道Func
                网站标题:LinqFunc简单概述
                
                转载源于:http://www.csdahua.cn/qtweb/news37/30387.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网