文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linq中如何实现Linq Func<T>

2023-06-17 22:37

关注

小编给大家分享一下Linq中如何实现Linq Func<T>,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

在Linq中,任何接收λ表达式(委托类型)的方法都可以转换为接收相同委托类型的Expression<T>的方法,并且不需要更改客户机代码。例如:

privatestaticvoid DoSomething(Predicate<Mock> predicate)

可以替换为:

privatestaticvoid DoSomething(  Expression<Predicate<Mock><Mock>> predicate)

在上述两种情况下,调用代码可以是相同的λ表达式:

DoSomething(x => x.Value > 25);

这里发生的情况是,编译器不会将指针传入到第二个方法签名的匿名委托中,而是生成以表达式树的形式构建AST(抽象语法树)的IL代码。如果您打开Reflector(我的类型反射类的名字也由此而来,它是任何高级开发人员都应该经常使用的最伟大的工具)并取消对DoSomething的方法调用,就可以看到:

ParameterExpression expression1 =  Expression.Parameter(typeof(Mock), "x");  Program.DoSomething(  Expression.Lambda<Predicate<Mock>>(  Expression.GT(Expression.Field(  expression1, fieldof(Mock.Value)),  Expression.Constant(0x19, typeof(int))),  newParameterExpression[]{expression1 })  );

这里您可以看到编译器如何使用Expression类上的静态方法构建整个表达式(我对API的详细看法另外单独讨论)。当然,在方法实现中,您可以检查相同的树并执行任何想执行的操作。***的Linq CTP包含一个非常酷的可视化工具,在运行时到达您的方法主体时可以用来查看表达式树中的情况。到现在为止,您应该明白了我正在实现一个强类型反射:我接收一个表达式树,并在其中搜索方法调用节点(或者,对于属性和字段来说是成员访问)。下面是Method<>方法的实现:

publicstaticMethodInfo Method<TDeclaringType>(  Expression<Operation> method)  {  return GetMethodInfo(method);  }     privatestaticMethodInfo GetMethodInfo(Expression method)  {  LambdaExpression lambda = method asLambdaExpression;  if (lambda == null)  thrownewArgumentNullException("method");   MethodCallExpression methodExpr = null;     // 我们的Operation<T>返回一个对象,故首先可以声名一  // 个类型转换(如果方法无返回对象)或直接方法调用。  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<T>(以及T、Arg0……),因为它们返回的是布尔值。我需要更灵活的对象,简单来说就是返回对象的对象,以及接收一些固定参数类型(例如Func<T>)的委托“重载”。因此我得到如下内容:

publicdelegateobjectOperation();  publicdelegateobjectOperation<T>(T declaringType);  publicdelegateobjectOperation(T declaringType, A0 arg0);  ...

注意,API的用户从来都不会知道这些委托类型的对象的存在,就像查询操作符的用户从不知道Func<T>的存在一样。我希望将来这些委托能够消失,而代之以更好的东西(可能是publicdelegateobject Operation < params T> ;))。此外,注意我是如何将新的参数类型的参数添加到T“后面”的,T是重载的通用转换,与Linq Func<T>中的功能正好相反。

以上是“Linq中如何实现Linq Func<T>”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯