强制 Expression<> 计算局部变量

2024-03-18

我的 LinqPad 中有类似的东西

void Main()
{
    var t1 = DateTimeOffset.Parse("10/1/2012");

    int? n1 = 1;

    Expression<Func<Sample,bool>> x1 = ud => 
        (ud.Date == t1 && ud.Number == n1);

    x1.ToString().Dump();
}

class Sample
{
    public int? Number{set;get;}
    public DateTimeOffset Date{set;get;}
}

它输出

ud => ((ud.Date == value(UserQuery+c_DisplayClass0).t1) AndAlso (ud.Number == value(UserQuery+c_DisplayClass0).n1))

有没有可能的方法来保留变量但让它输出类似这样的内容:

ud => ((ud.Date == Parse("10/1/2012")) AndAlso (ud.Number == 转换(1)))


开始了;先输出:

ud => ((ud.Date == 10/01/2012 00:00:00 +00:00) AndAlso (ud.Number == 1))

这永远不会输出Parse(...),因为你的表情不含解析:当您将其放入 lambda 时,您已经对其进行了评估。

另请注意,这处理一级捕获的变量。对于更复杂(嵌套)的捕获上下文,您必须以递归方式从捕获类中获取值:

using System;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
static class Program
{
    static void Main()
    {
        var t1 = DateTimeOffset.Parse("10/1/2012");

        int? n1 = 1;

        Expression<Func<Sample, bool>> x1 = ud =>
            (ud.Date == t1 && ud.Number == n1);

        var sanitized = (Expression<Func<Sample, bool>>)
            new Literalizer().Visit(x1);

        Console.WriteLine(sanitized.ToString());
    }
}

class Literalizer : ExpressionVisitor
{
    protected override Expression VisitMember(MemberExpression node)
    {
        if(node.Member.DeclaringType.IsDefined(typeof(CompilerGeneratedAttribute), false)
            && node.Expression.NodeType == ExpressionType.Constant)
        {
            object target = ((ConstantExpression)node.Expression).Value, value;
            switch (node.Member.MemberType)
            {
                case MemberTypes.Property:
                    value = ((PropertyInfo)node.Member).GetValue(target, null);
                    break;
                case MemberTypes.Field:
                    value = ((FieldInfo)node.Member).GetValue(target);
                    break;
                default:
                    value = target = null;
                    break;
            }
            if (target != null) return Expression.Constant(value, node.Type);
        }
        return base.VisitMember(node);
    }
}

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

强制 Expression<> 计算局部变量 的相关文章

随机推荐

  • 将对象列表中的对象项替换为另一个项

    我的变量中有一个项目对象this rows 有一个来自服务器的实时项目与里面的项目相同this rows对象集合 如何用新值替换项目 这是一个例子 let rows id 11 active no id 22 active yes id 3
  • FirebaseCrashlytics:设置请求失败

    我几乎完成了 Android 应用程序的构建 但我想添加 Firebase Crashlytics 我总是添加这个并且安装它从来没有遇到过问题 但现在不同了 我收到以下错误 2021 05 24 20 41 42 807 11296 113
  • Ubuntu 16.10 x64 上的 Laravel 5.3 的 Cron 作业

    我正在运行 Digital Ocean 的 Ubuntu 16 10 x64 并在服务器上部署了 php Framework Laravel 5 3 28 在大多数情况下 一切都正常工作 但是我试图让 crontab 调用 artisan
  • Hudson 经验 - 构建矩阵项目

    有人尝试过该功能并有一些反馈吗 或者有人知道一些有用的示例来查找吗 几个月前我尝试过这个功能 但我不再使用它 只是因为我不需要它 而不是因为它不是一个好功能 基本上 您定义 n 个轴 每个轴都是一个具有多个值的属性 让我们举个例子 您定义了
  • 是否可以使用 AJAX 将图像文件上传到 Domino 服务器?

    是否可以使用 AJAX 将图像文件上传到 Domino 服务器 我正在尝试从 Android 手机上传照片 我可以将图像数据发送回 Domino 中的富文本字段 但我不知道如何将其渲染为多米诺表单上的图像 理想情况下 我想通过 ajax 发
  • 公共记录类型的构造函数?

    假设我想要一个记录类型 例如 type CounterValues Values int list IsCorrupt bool 问题是 我想创建一个构造函数 将传递的整数列表转换为一个没有负值的新列表 它们将被 0 替换 并且仅当在构造时
  • 无法将 NULL 值插入 AspNetUsers 表“Discriminator”列

    代码首次迁移后 使用寄存器添加用户失败 并显示 无法将 NULL 值插入表 aspnet BSF2013 20130918101120 dbo AspNetUsers 列 Discriminator 列不允许为空 创建用户代码是项目模板生成
  • 如何在计时器到期时关闭 InfoBox.Popup?

    我在 Outlook 2013 中从其他帖子中拼凑出了这个测试过程 它应该显示一个弹出框 然后在 3 秒后关闭 它永远不会关闭 Sub MessageBoxTimer Dim AckTime As Integer InfoBox As Ob
  • JLabel 超链接可在正确的 URL 处打开浏览器

    我需要使用 Java Swing 创建一个可单击的标签 并且能够打开桌面上的默认浏览器并将其重定向到特定的 url 我的代码能够打开浏览器 但无法将其重定向到正确的网址 加载默认主页 我的测试代码 import java awt impor
  • Node.js 用户名和密码认证

    我目前正在使用构建一个网络应用程序Node js and Express js 我正在寻找一种方法 在我的主目录中使用用户名和密码进行简单的服务器端身份验证app js正在监听的文件post请求于http www domain com lo
  • 如何在 Android 选择器中定义粗体?

    在我的 Android 应用程序中 我有几个单选按钮 它们应该具有不同的颜色并在选择时变为粗体 我设法通过定义来获得不同的颜色radio pick color xml可绘制文件
  • iOS 强密码自动填充未显示在确认密码上

    iOS 会自动填充第一个密码字段 但不会填充第二个密码字段 如何像应用程序中那样自动填充密码和确认密码字段 更新 系统似乎将注册表单视为登录表单 因此它会自动填充第一个密码字段 另外 当我导航回登录屏幕时 系统提示我是否要将密码保存在钥匙串
  • 如何在IDEA中打开项目时停止自动刷新SBT模块?

    我们有多个 Play 2 应用程序和模块 但我在将 IntelliJ IDEA 13 集成到我的开发流程中时遇到了问题 我有一个基于应用程序的公共父级的空项目 并且我已使用导入现有 SBT 项目选项将每个应用程序作为模块导入 我的问题是 每
  • Plotly for R:当数据集包含大于 1000 的数字时,删除 y 轴上出现的 k

    您好 关于plotly的一个 简单 问题 我想删除当数据集包含大于10000的数字时似乎自动出现在y轴上的k 我尝试将数据上传到plotly在线并将 k 放入以及 例如使用数据的子集 date lt c 1 07 1987 2 07 198
  • 应用程序部署到网络驱动器

    我有一个 NET 4 WPF需要在公司网络内运行的应用程序 该应用程序不使用本地文件 它确实有一个app config文件 但它只包含一些connection strings 用于数据存储 但中央SQL server数据库 将应用程序文件放
  • 如何在 python Bottle 中提供带有希伯来语名称的静态文件?

    我收到客户端的请求 要求从服务器下载一些文件 文件名是希伯来语 bottle get download
  • Python/ Boto 3:如何从AWS S3检索/下载文件?

    在Python Boto 3中 发现从S3单独下载文件到本地可以执行以下操作 bucket self aws connection get bucket aws bucketname for s3 file in bucket list i
  • 使用 CakePHP 将视图嵌入到另一个视图中

    我有一个新闻控制器 每个新闻项目都有一个 查看 操作 在每个新闻项目的 查看 操作中 我想包含另一个视图 即评论控制器的 添加 操作 基本上 我需要在每个新闻项目的页面上添加一个表单来添加评论 我有两种观点 但我无法将它们联系起来 我尝试使
  • 期望在 while 循环内 - 永远循环

    我是新来的脚本 所以请原谅我的绊脚石 以下是我的预期脚本的主要内容 目的是滚动浏览多个输出屏幕 在每个屏幕之后都会提示用户 继续 y n 最后 当没有更多屏幕时 会显示 提示符 这应该导致执行脱离 while 循环 set more scr
  • 强制 Expression<> 计算局部变量

    我的 LinqPad 中有类似的东西 void Main var t1 DateTimeOffset Parse 10 1 2012 int n1 1 Expression