本文我们开始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。内容未经允许不得转载,或转载时需注明来源: 快上网