返回顶部
首页 > 资讯 > 精选 >Linq中如何实现Linq Func<T>
  • 647
分享到

Linq中如何实现Linq Func<T>

2023-06-17 22:06:23 647人浏览 泡泡鱼
摘要

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

小编给大家分享一下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>”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Linq中如何实现Linq Func<T>

本文链接: https://lsjlt.com/news/293676.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Linq中如何实现Linq Func<T>
    小编给大家分享一下Linq中如何实现Linq Func<T>,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在Linq中,任何接收λ表达式(委托类型)的...
    99+
    2023-06-17
  • 如何使用Func<T, TResult> 委托实现API日志的记录
    这篇文章主要介绍了如何使用Func<T, TResult> 委托实现API日志的记录,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下...
    99+
    2024-04-02
  • 如何在Java8中将List<T>转为Map<String,T>
    这篇文章主要介绍了如何在Java8中将List<T>转为Map<String,T>,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:Java是什么Java是一门面向对...
    99+
    2023-06-06
  • .NET 排序 Array.Sort<T> 实现示例
    目录Array.SortArraySortHelperGenericArraySortHelperIntroSortInsertionSort总结System.Array.Sort&...
    99+
    2024-04-02
  • Linq如何实现XML转换
    本篇文章给大家分享的是有关Linq如何实现XML转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。学习Linq时,经常会遇到Linq实现XML转换问题,这里将介绍Linq实现X...
    99+
    2023-06-17
  • Linq如何实现延迟加载
    小编给大家分享一下Linq如何实现延迟加载,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq延迟加载在查询某对象时,实际上你只查询该对象。不会同时自动获取这个...
    99+
    2023-06-17
  • LINQ to DataSet如何实现查询
    这篇文章主要介绍了LINQ to DataSet如何实现查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。LINQ to DataSet主要是提供对离线数据的支持,只有在填充...
    99+
    2023-06-17
  • LINQ如何实现查询操作
    这篇文章主要介绍了LINQ如何实现查询操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。LINQ,语言级集成查询(Language INtegrated Query)经过了最...
    99+
    2023-06-17
  • 如何实现LINQ查询语句
    本篇文章给大家分享的是有关如何实现LINQ查询语句,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现LINQ查询语句有三个步骤,他们分别是获取数据源(任何查询的必备工作)、创建...
    99+
    2023-06-17
  • Linq如何实现多个结果集
    小编给大家分享一下Linq如何实现多个结果集,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq多个结果集这种存储过程可以生成Linq多个结果集形状,但我们已经...
    99+
    2023-06-17
  • LINQ如何实现查询表达式
    这篇文章主要介绍了LINQ如何实现查询表达式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。新建一个叫Step1.aspx的新页面。添加一个GridView控件到页面中,如下所...
    99+
    2023-06-17
  • C#泛型集合类List<T>如何使用
    这篇“C#泛型集合类List<T>如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#泛型集合类List&...
    99+
    2023-06-30
  • Linq 中SelectMany如何使用
    这篇文章将为大家详细讲解有关Linq 中SelectMany如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.一对多关系(1 to Many):var q&nbs...
    99+
    2023-06-17
  • Linq 中 DataTable如何使用
    今天就跟大家聊聊有关Linq 中 DataTable如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Linq To DataTableLinq已经让我们感觉不到Query的难点...
    99+
    2023-06-17
  • 如何分析Nullable<T>的类型转换问题
    这篇文章跟大家分析一下“如何分析Nullable<T>的类型转换问题”。内容详细易懂,对“如何分析Nullable<T>的类型转换问题”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。...
    99+
    2023-06-17
  • 怎么在C#项目中实现一个带通知的List<T>
    怎么在C#项目中实现一个带通知的List<T>?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。实现using System;using Syste...
    99+
    2023-06-06
  • 如何浅析LINQ嵌套的实现过程
    这篇文章将为大家详细讲解有关如何浅析LINQ嵌套的实现过程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。LINQ嵌套的操作是什么呢?LINQ嵌套需要注意什么呢?LINQ嵌套使用的是什么方法呢...
    99+
    2023-06-17
  • Linq如何定义实体继承
    这篇文章给大家分享的是有关Linq如何定义实体继承的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Linq实体继承的定义Linq to sql支持实体的单表继承,也就是基类和派生类都存储在一个表中。对于论坛来说,帖...
    99+
    2023-06-17
  • Linq如何定义实体关系
    这篇文章主要介绍了Linq如何定义实体关系,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Linq实体关系的定义比如我们的论坛分类表和论坛版块表之间就有关系,这种关系是1对多的...
    99+
    2023-06-17
  • 如何在java中使用<<、>>进行移位操作
    如何在java中使用<<、>>进行移位操作?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。<<,有符号左移位,将运算数的二进制整体左移指定...
    99+
    2023-05-31
    java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作