.Net CodeDom - 在 .net 中实现 lambda 表达式

2024-02-18

我想使用 CodeDom 写这样的东西:

.Where(x => x.Id == 2);

我不知道 CodeDom (System.CodeDom) 中与此等效的是什么。


简短回答:CodeDOM 不支持 lambda。

长答案:CodeDOM 不支持 lambda,因此您必须使用解决方法。一些选项:

  1. Use CodeSnippetExpression:

    new CodeMethodInvokeExpression(
        collectionExpression, "Where", new CodeSnippetExpression("x => x.Id == 2"));
    

    这样,您就失去了使用 CodeDOM 的大部分优势,但它很简单,您可以完全按照您的意愿进行操作。

  2. 创建一个包含 lambda 代码的方法,然后使用引用它的委托:

    var lambdaMethod = new CodeMemberMethod
    {
        Name = "IsIdTwo",
        Parameters =
        {
            new CodeParameterDeclarationExpression(
                new CodeTypeReference("YourEntityType"), "x")
        },
        Statements =
        {
            new CodeMethodReturnStatement(
                new CodeBinaryOperatorExpression(
                    new CodePropertyReferenceExpression(
                        new CodeVariableReferenceExpression("x"), "Id"),
                    CodeBinaryOperatorType.ValueEquality,
                    new CodePrimitiveExpression(2)))
        }
    };
    
    …
    
    new CodeMethodInvokeExpression(
        collectionExpression, "Where", new CodeMethodReferenceExpression(null, "IsIdTwo"))
    

    这会生成如下代码:

    private void IsIdTwo(YourEntityType x) {
        return (x.Id == 2);
    }
    
    …
    
    collection.Where(IsIdTwo)
    

    这种方法的问题在于,它生成的代码与您想要的不同(且可读性较差),并且如果查询必须是表达式,则它将不起作用,通常是因为您正在使用IQueryable<T>使用实体框架之类的东西。

  3. 切换到支持 lambda 的代码生成库,例如 Roslyn:

    using Microsoft.CodeAnalysis;
    using Microsoft.CodeAnalysis.CSharp;
    using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
    
    …
    
    InvocationExpression(
        MemberAccessExpression(
            SyntaxKind.SimpleMemberAccessExpression,
            IdentifierName("collection"),
            IdentifierName("Where")),
        ArgumentList(
            SingletonSeparatedList(
                Argument(
                    SimpleLambdaExpression(
                        Parameter(Identifier("x")),
                        BinaryExpression(
                            SyntaxKind.EqualsExpression,
                            MemberAccessExpression(
                                SyntaxKind.SimpleMemberAccessExpression,
                                IdentifierName("x"),
                                IdentifierName("Id")),
                            LiteralExpression(
                                SyntaxKind.NumericLiteralExpression, Literal(2))))))))
    

    或者使用SyntaxGenerator:

    var generator = SyntaxGenerator.GetGenerator(new AdhocWorkspace(), LanguageNames.CSharp);
    
    generator.InvocationExpression(
        generator.MemberAccessExpression(generator.IdentifierName("collection"), "Where"),
        generator.ValueReturningLambdaExpression(
            "x",
            generator.ValueEqualsExpression(
                generator.MemberAccessExpression(generator.IdentifierName("x"), "Id"),
                generator.LiteralExpression(2))))
    

    这里明显的缺点是您必须重写代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net CodeDom - 在 .net 中实现 lambda 表达式 的相关文章

  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 在 ASP.NET MVC 中将模型从视图传递到控制器

    我正在 ASP NET MVC 中开发我的第一个应用程序 但遇到了一个我无法解决的问题 即使在阅读了整个互联网之后也是如此 因此 我有几个使用视图模型创建的视图 它们是报告 这些视图模型是根据用户选择标准填充的 我正在尝试构建一种接受模型并
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • 将下拉列表与字典绑定

    我将字典绑定到下拉列表 举例来说 我的字典中有以下项目 Test1 123 Test2 321 我希望下拉文本采用以下格式 Test1 Count 123 Test2 Count 321 我沿着以下路径走 但没有运气 MyDropDown
  • .NET 程序集差异/比较工具 - 有什么可用? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在两个程序集之间进行代码级差异 Reflector 的 Diff 插件是迄今为止我发现的最接
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 如何在网页上实现文件上传进度条?

    当用户将文件上传到我的网络应用程序时 我想显示比动画 gif 更有意义的内容 我还有哪些可能性 编辑 我正在使用 Net 但我不介意是否有人向我展示与平台无关的版本 如果您对这一切在客户端通常如何工作感兴趣 就是这样 所有解决方案都通过 J
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • Autoconf 问题:“错误:C 编译器无法创建可执行文件”

    我正在尝试使用 GNU 自动工具构建一个用 C 编写的程序 但显然我设置错误 因为当configure运行 它吐出 configure error C compiler cannot create executables 如果我看进去con
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • SQL Server“未找到网络路径”在不同环境中随机且不频繁地发生

    类似 如果不是同一个问题 随机遇到网络路径未找到异常 https stackoverflow com questions 38696448 network path not found exception encountered rando
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • wpf按钮背景图片

    我有一个带有 5 个按钮的 wpf 页面 所有 5 个按钮必须具有相同的大小 并且必须具有相同的背景图像 这个怎么做 问候 卡恩 使用样式 这将自动应用于all窗口中的按钮
  • 如何在ansible命令中传递用户/密码

    我想使用 Ansible 作为另一个 Python 软件的一部分 在该软件中 我有一个主机列表及其用户 密码 有没有办法将 SSH 连接的用户 密码传递给 Ansible ad hoc 命令或以加密方式将其写入任何文件中 还是我理解错了 唯
  • 如何将变量从 awk 传递到 shell 命令?

    我正在尝试从 awk 中为文件的每一行运行 shell 命令 并且 shell 命令需要一个输入参数 我尝试使用system 但它无法识别输入参数 该文件的每一行都是一个文件的地址 我想运行一个命令来处理该文件 因此 对于一个简单的示例 我
  • 实体框架 - 我应该如何实例化我的“实体”对象

    我是实体框架和 ASP Net MVC 的新手 主要从教程中学习 但对两者都没有深入的了解 我确实有 Net 2 0 ADO Net 和 WebForms 的经验 我当前的怀疑来自于我实例化实体对象的方式 基本上我在我的控制器中这样做 pu
  • Python 数组重塑形状数组问题(无,192)

    我有这个错误 我不知道如何重塑有尺寸的地方None Exception Error when checking expected input 1 to have shape None 192 but got array with shape
  • 在 Rails 3.1 的开发模式下启用图像缓存

    在 Rails 3 1 开发模式中 使用资产管道时 从资产 图像中提供的图像会附带响应标头 缓存控制 必须重新验证 这意味着 Google Chrome 似乎只有 Chrome 将尝试多次重新获取图像 即使在单个页面视图期间也是如此 这导致
  • SSL_connect 返回=1 errno=0 状态=错误:在 ruby​​ 和 Ubuntu 14.04 中证书验证失败

    我有一个与第三方网络服务集成的 Rails 应用程序 自最初开发以来 它多年来一直运行良好 由于某种意想不到的原因 它突然停止工作了 我想说我们没有更改代码中的任何内容 唯一可以与之相关的是我们的 Letscrypt SSL 证书已过期并且
  • 使用 Entity Framework 4.0 中的上下文确定实体的主键

    我有几个从实体框架数据模型生成的实体 在 edmx 文件中 我可以看到标记为主键的属性 我的 POCO 自定义上下文是从此模板和 T4 模板生成的 我正在寻找一种方法来使用 Entity Framework 4 0 的反射来找出实体的主键
  • 自己的 std::is_function 实现

    建议here http en cppreference com w cpp types is function按以下方式实施 template
  • Java 8 ifPresent 与三元运算符

    你认为哪个更好 当然有争论 Optional ofNullable userName ifPresent nonNullUserName gt header setUser createUser nonNullUserName or hea
  • 如何实现 PlaceAutocompleteFragment 和 PlaceAutocompleteActivity 来获取地点详细信息

    我在用谷歌地方 https developers google com places android api hl en获取地点详细信息 Google 提供了不同的方式来实现 Google Place API 来获取地点详细信息 不同的方式
  • 返回值存储在内存的什么位置?

    返回值存储在内存的什么位置 考虑以下代码 int add int a int b int result a b return result void main int sum add 2 3 When add 2 3 被调用时 2个函数参数
  • 2012 年附加到流程

    我们曾经在 VS 2010 中附加了进程宏 这非常方便 既然宏在 Visual Studio 2012 中消失了 是否存在可以为我们执行此操作的插件 我们的宏将附加到 w3 exe 进程 这非常漂亮 也许我需要将宏转换为插件 我使用这个扩展
  • 神奇记录迁移失败“找不到源存储的模型”

    我们对 CoreData 模型进行了一些更改 看起来自动迁移失败了 即使我们将当前模型设置为用于生成数据的原始模型 仍然会出现错误 Reason 找不到源商店的模型 2014 09 05 02 19 43 297 948 166846 LB
  • 用户“postgres”的 Docker 密码身份验证失败

    我正在编写一个 docker compose 文件来启动一些服务 但数据库服务是个麻烦制造者 我总是收到此错误 FATAL password authentication failed for user postgres DETAIL Pa
  • 这个错误应该被修复吗?

    昨天我在 Net框架中发现了一个bug 并且发现这是一个已知的bug 不会被修复 简而言之 该错误在于 当将 int 以及可能的其他二进制类型 分配给该字段时 包含 IComparable 类型字段的类无法进行二进制序列化和反序列化 Ser
  • 类型错误:无法从 ndarray 中减去 DatetimeArray

    我的数据框中有两列 开始日期和完成日期 它是时间戳 我想通过找出差异来计算运行时间 当我运行下面的代码时 出现错误 TypeError cannot subtract DatetimeArray from ndarray 我也无法将完成日期
  • 如何撤消 Redux 异步操作? (状态后退多步)

    如果我有一个带有 api 调用的异步操作 它可以是一个操作返回一个函数 export function asyncAction itemId return dispatch gt dispatch requestStarted return
  • 检查数字是否具有相同的符号

    我遇到过这个 检查两个整数是否具有相同符号的最简单方法 https stackoverflow com questions 66882 simplest way to check if two integers have same sign
  • .Net CodeDom - 在 .net 中实现 lambda 表达式

    我想使用 CodeDom 写这样的东西 Where x gt x Id 2 我不知道 CodeDom System CodeDom 中与此等效的是什么 简短回答 CodeDOM 不支持 lambda 长答案 CodeDOM 不支持 lamb