动态将 Expression> 转换为 Expression

2023-11-21

我找不到从 Expression> 转换为 Expression> 的方法。由于我使用了大量反射,实际上,我真正需要的是一种采用类型参数并执行转换的方法。

public object Convert(Expression<Func<T1,bool>> expr, Type t);

T2源自T1

public class T1 {
     int FamilyId {get; set;}
}

public class T2 : T1 {
     ... other properties
}

我在基类上定义一个过滤器表达式

Expression<Func<T1,bool>> filter = p => p.FamilyId == [some value]

我想应用于列表


这是您要找的吗?该方法有两种风格:第一种允许您将新的输入类型作为参数传递;第二种允许您将新的输入类型作为参数传递。第二个允许您将输入类型作为泛型参数传递并获取强类型的 LambdaExpression。

    public static LambdaExpression ChangeInputType<T, TResult>(Expression<Func<T, TResult>> expression, Type newInputType)
    {
        if (!typeof(T).IsAssignableFrom(newInputType))
            throw new Exception(string.Format("{0} is not assignable from {1}.", typeof(T), newInputType));
        var beforeParameter = expression.Parameters.Single();
        var afterParameter = Expression.Parameter(newInputType, beforeParameter.Name);
        var visitor = new SubstitutionExpressionVisitor(beforeParameter, afterParameter);
        return Expression.Lambda(visitor.Visit(expression.Body), afterParameter);
    }

    public static Expression<Func<T2, TResult>> ChangeInputType<T1, T2, TResult>(Expression<Func<T1, TResult>> expression)
    {
        if (!typeof(T1).IsAssignableFrom(typeof(T2)))
            throw new Exception(string.Format("{0} is not assignable from {1}.", typeof(T1), typeof(T2)));
        var beforeParameter = expression.Parameters.Single();
        var afterParameter = Expression.Parameter(typeof(T2), beforeParameter.Name);
        var visitor = new SubstitutionExpressionVisitor(beforeParameter, afterParameter);
        return Expression.Lambda<Func<T2, TResult>>(visitor.Visit(expression.Body), afterParameter);
    }

    public class SubstitutionExpressionVisitor : ExpressionVisitor
    {
        private Expression before, after;
        public SubstitutionExpressionVisitor(Expression before, Expression after)
        {
            this.before = before;
            this.after = after;
        }
        public override Expression Visit(Expression node)
        {
            return node == before ? after : base.Visit(node);
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态将 Expression> 转换为 Expression 的相关文章

随机推荐

  • 如何在 javascript 中动态创建具有值数组的地图

    我有这个要求 根据函数中传递的参数数量 我需要在映射中创建那么多条目 假设我有一个函数 myfunc1 a b c 我需要一张键为 a b 和 c 的映射 并且每个键可以有多个值 但问题是我事先不知道这些键会有多少值 当值出现时 我需要将它
  • openssl 中是否有任何 C API 可以从给定字符串派生密钥

    我需要 openssl 库中的 C API 来从给定的字符串派生密钥 我在哪里可以获得这方面的示例源代码 执行此操作的标准算法是 PBKDF2 PBKDF2 的缩写 基于密码的密钥派生函数版本 2 OpenSSL 中有一个 PBKDF2 的
  • 确定我的电脑是否支持硬件虚拟化

    一般来说 如何确定一台 PC 是否支持硬件虚拟化 我使用 VirtualPC 来设置并行测试环境 并且我会享受一点速度提升 下载这个 http www cpuid com cpuz php 还要检查 http en wikipedia or
  • 检查用户名或用户电子邮件已存在

    我正在一个简单的注册页面中工作 用户无法输入相同的用户名或电子邮件 我编写了一个代码来阻止用户输入用户名并且它起作用了 但是当我试图阻止用户输入相同的用户名时或通过电子邮件发送它不起作用 我的问题是 如何添加另一个条件 使用户无法输入已存在
  • Javascript:何时在构造函数内定义函数以及何时使用原型?

    我注意到在各种教程中向 类 添加函数的不同方法 第一个是在类的构造函数中 Class function this doSomething function 另一种是 Class function Class prototype doSome
  • 如何找到退化树中从特定顶点开始的所有相等路径?

    我有一些degenerate tree 它看起来像数组或双向链表 例如 是这棵树 每条边都有一定的权重 我想找到从每个顶点开始的所有相等路径 换句话说 我想获取所有元组 v1 v v2 其中 v1 和 v2 是任意祖先和后代 使得c v1
  • Android 将图片发布到 Facebook 墙

    我正在尝试将照片发布到我的 Facebook 墙上 我已经成功登录并将文本发布到墙上 然而 当我尝试发布图片时 什么也没有发生 我正在使用Android 脸书 SDK 这是我到目前为止所拥有的 Bundle params new Bundl
  • PHP 5.2 注意:使用未定义常量 __DIR__ - 假定 '__DIR__ [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 在 php 5 3 或更低
  • 使用 Sass / Compass 的多个背景图像

    下面使用 sass compass 生成一个 base64 内联图像 background image inline image paper jpg image jpg 有没有办法制作多个背景图像 或者我必须自己预压缩它们才能做到这一点 T
  • Python OpenCV - 删除标题栏、工具栏和状态栏

    我找到了关于 C 的文档 但关于 python 的文档却很少 python 中显示的基本代码是 import numpy as np import cv2 Load an color image in grayscale img cv2 i
  • 在 Flask 中,如何重定向到模板并在视图中返回 send_file 后显示消息?

    我第一次深入使用 Flask 遇到了一个小问题 我有一个带有表单和一堆复选框的页面 提交表单时 我将从所有复选框中获取值并将其传递到一个脚本 我已经有 中 该脚本基本上会写入一个 CSV 文件 我所做的是 提交表单后 CSV 文件在后台创建
  • 推荐用于 JQuery 的 JavaScript HTML 模板库吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 关于哪个 HTML 模板库
  • 如何使用 JPA Criteria API 解析 Oracle 的“rownum”伪列?

    我想使用 JPA Criteria 从数据库获取第一行 我使用JPA Hibernate 4 2 7 在 SQL 中 语句如下所示 SELECT FROM houses WHERE rownum 1 我的 Java 代码实现如下所示 Cri
  • Fabric js 使用自定义属性扩展 toObject,丢失了默认属性

    在发布这篇文章之前 我一直在这里和其他许多地方一样进行查找 但我可以让它充分发挥作用 我所需要的只是能够在所有形状中保存一些自定义属性 属性是 uuid 和 rt attributes 因此 按照手动方式 我添加了以下代码 fabric O
  • 如何在cygwin上通过控制台安装以前版本的软件包?

    我需要编写一个使用 svn 1 6 17 部署许多 cygwin 应用程序的脚本 我所有的尝试都是通过安装 svn 1 7 或什么都不完成 我尝试安装 subversion subversion 1 6 subversion 1 6 17
  • 连接 xml 文件

    我有几个 xml 文件 其名称存储在另一个 xml 文件中 我想使用 xsl 生成 xml 文件组合的摘要 我记得有一种方法可以使用 msxml 扩展来执行此操作 我正在使用 msxml 我知道我可以使用获取每个文件的内容select do
  • 如何使用 JavaScript 检测 Chrome v78+ 上的 #enable-force-dark 标志?

    我最近为我的网站设计并实现了一种深色模式 该模式使用自定义深色来匹配浅色 默认 配色方案 而且我最近还意识到 Chrome 78 有一个可选标志 称为 enable force dark 启用后 用户必须这样做 Chrome 会自动尝试将网
  • 验证用 javascript 逗号分隔的多个电子邮件

    我想验证一个字符串 它可以是一封电子邮件或多封以逗号分隔的电子邮件 例如 电子邮件受保护 gt 正确账单 gt 假 电子邮件受保护 电子邮件受保护 gt 正确 电子邮件受保护 电子邮件受保护 鲍勃 gt 假 bob 电子邮件受保护 电子邮件
  • 如何在静态上下文中将泛型类与特定对象一起使用?

    我会尽力解释 我使用 Play Framework 2 我会做很多 CRUD 操作 其中一些是相同的 所以我想 KISS 和 DRY 所以一开始我正在考虑一个包含以下内容的抽象类list details create update and
  • 动态将 Expression> 转换为 Expression

    我找不到从 Expression gt 转换为 Expression gt 的方法 由于我使用了大量反射 实际上 我真正需要的是一种采用类型参数并执行转换的方法 public object Convert Expression