如何使用表达式树调用带有引用变量的方法

2023-12-20

我试图弄清楚如何创建一个调用具有引用参数的方法的表达式。

让我用一个简单(但人为的)例子来解释我的问题。考虑方法:

    public static int TwiceTheInput(int x)
    {
        return x*2;
    }

我可以创建一个表达式来通过执行以下操作来调用上述方法:

    {
        var inputVar = Expression.Variable(typeof (int), "input");
        var blockExp =
            Expression.Block(
                    new[] {inputVar}
                    , Expression.Assign(inputVar, Expression.Constant(10))
                    , Expression.Assign(inputVar, Expression.Call(GetType().GetMethod("TwiceTheInput", new[] { typeof(int) }), inputVar))
                    , inputVar
                    );
        var result = Expression.Lambda<Func<int>>(blockExp).Compile()();
    }

执行时,上面的“结果”最终应为 20。 现在考虑使用引用参数的 TwiceTheInput() 版本:

    public static void TwiceTheInputByRef(ref int x)
    {
        x = x * 2;
    }

如何编写类似的表达式树来调用 TwiceTheInputByRef() 并通过引用传递参数?

解决方案:(感谢Cicada)。使用:

Type.MakeByRefType()

这是生成表达式树的代码段:

        {
        var inputVar = Expression.Variable(typeof(int), "input");
        var blockExp =
            Expression.Block(
                    new[] { inputVar }
                    , Expression.Assign(inputVar, Expression.Constant(10))
                    , Expression.Call(GetType().GetMethod("TwiceTheInputByRef", new[] { typeof(int).MakeByRefType() }), inputVar)
                    , inputVar
                    );
        var result = Expression.Lambda<Func<int>>(blockExp).Compile()();
    }

你不需要做太多改变,只需删除Assign并改变typeof(int) to typeof(int).MakeByRefType().

var blockExp = Expression.Block(
    new[] { inputVar }
    , Expression.Assign(inputVar, Expression.Constant(10))
    , Expression.Call(
       typeof(Program).GetMethod( 
           "TwiceTheInputByRef", new [] { typeof(int).MakeByRefType() }),
       inputVar)
    , inputVar
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用表达式树调用带有引用变量的方法 的相关文章

随机推荐

  • javascript 中字符类的范围乱序

    我不知道为什么我的正则表达式不正确 var domain google com br var reEmail new RegExp A Za z0 9 domain 我需要这个来验证电子邮件 下面的例子 reEmail test email
  • 将额外数据传递给 EditorTemplate

    假设我有一个 LineItem 来自过度使用的购物车示例 并且我想使用 EditorTemplate 来呈现它 我完全可以使用父视图 部分或其他 中的 Html EditorFor m gt m LineItems 渲染它 但令人困惑的是传
  • 第一次达到某个数字时递增计数器

    这可能是一个非常愚蠢的问题 不过 我还是要问一下 如何仅在第一次达到特定值时增加计数器 例如 如果我将下面的步骤作为 df 的一列 并且想要添加一个名为 counter 的计数器列 该计数器列在 step 列第一次值为 6 时递增 您可以使
  • SpringFox - 隐藏 Swagger-ui 中调用端点不需要的某些字段

    我想知道是否有任何方法可以使 SpringFox 不显示在调用特定端点时不需要的某个实体的所有字段 例如 具有以下实体 public class Car long id String name int wheels String type
  • 如何在 Google Maps Android API v2 中向 MapFragment 添加自定义控件?

    我有 SupportMapFragment 我需要向其中添加自定义控件以更改地图类型 调用 getView 我得到 NoSaveStateFramelayout 我认为将其直接添加到它或其子级中不是一个好主意 如何在地图上添加按钮以更改地图
  • Spark (Scala) 从驱动程序写入(和读取)本地文件系统

    第一个问题 我有一个带有 hadoop 的 2 节点虚拟集群 我有一个运行 Spark 作业的罐子 该 jar 接受 cli 参数 commands txt 文件的路径 该文件告诉 jar 要运行哪些命令 我使用spark submit运行
  • CloudKit 安全角色和权限如何工作?

    CloudKit 中默认存在三个安全角色 World 已认证 Creator 以及三个权限 Create Read Write 这些安全角色和权限如何工作 以下是我希望通过安全角色的解释得到解答的一些问题的示例 三个角色分别代表什么意思 前
  • 带有 R 和 Rgl 的彩色球体的 3d 散点图

    我想创建一个球体的 3D 散点图 其颜色为第四维 我有一个 csv 文件中的数据 其中每行表示粒子的 x y z 位置 并且有一列告诉我粒子的值 1 2 或 3 如果球的值为 1 我想将其着色为一种颜色 否则为另一种颜色 Edit 我创建了
  • 以编程方式更新应用程序时出现解析错误

    我的目标是将应用程序更新托管到远程服务器并通过 API 检查更新 应用程序将检查定义的 url 来检查更新 如果响应版本代码大于当前代码 它将从服务器下载更新的 apk 并通过代码安装它 我托管了一个 PHP 文件 用于检查服务器的版本和
  • XMPPFramework - 如何创建MUC房间并邀请用户?

    我正在使用 Robbiehanson 的 iOS XMPPFramework 我正在尝试创建一个 MUC 房间并邀请用户加入群聊房间 但它不起作用 我正在使用以下代码 XMPPRoom room XMPPRoom alloc initWit
  • 如何使用具有正确标头和 SHA512 哈希令牌的节点生成正确的 TOTP?

    我最近分配的一个学校项目有一个我们必须完成的编码挑战 该挑战由多个部分组成 最后一部分是上传到私有 GitHub 存储库 并在特定条件下通过发出 POST 请求来提交完成请求 我已成功完成挑战的其他部分 但仍坚持提交请求 提交作品须遵守以下
  • 将直接 JS 转换为 JQuery

    我正在尝试从 last fm API 附加一些 JSON 数据 我一直在几个阶段使用alert 来验证API是否被正确解析 它是 这让我得出这样的结论 getElementById appendChild 不起作用 下面是我设置的测试页面的
  • Java优先级队列等待

    我正在尝试使用多线程解决 Java 中编写者偏好的读者 编写者问题 以下是我的代码的精简版本 它会起作用吗 public PriorityQueue
  • 用于定义给定重复模式的函数的球拍宏

    这个问题很难解释 因为我需要整理思绪 所以请耐心等待 为了说明目的 我已经能够将问题简化为最小的示例 这个例子对于它的用途没有任何意义 但我离题了 假设我想扩展球拍语言来编写如下所示的内容 define something a whatev
  • re.finditer 和 re.findall 之间的不同行为

    我正在使用以下代码 CARRIS REGEX r th d th th s w th th d d th th d m th pattern re compile CARRIS REGEX re UNICODE matches patter
  • iOS。 CLLocationManager 在 didUpdateLocations 中仅接收一次位置更新

    我有以下代码来获取位置更新 iOS 7 import UIKit import CoreLocation class FirstViewController UIViewController CLLocationManagerDelegat
  • 从文档中提取数据

    我有一个文本文件 其中的数据如下 07 30 07 45PMTS09526052 Sev9 Location Due 12 23 2016 NON PC HARDWARE TROUBLESHOOT SW Complete this Job
  • C++ 中什么被视为小对象?

    我读过 现代 C 设计 中有关小对象分配的内容 Andrei Alexandrescu 认为通用运算符 new 和 delete 在分配小对象时表现不佳 在我的程序中 有很多对象在免费商店中创建和销毁 这些对象的大小超过 8000 字节 什
  • 通过Emacs在代码注释中插入图片

    我的脑海里刚刚浮现出一个想法 有没有什么方法可以在代码注释中插入图片来帮助解释我们的代码 毕竟 一张图胜过一千个字 由于我使用Emacs 到目前为止Emacs有任何实现吗 看一眼iimage mode 这是在文本缓冲区中显示图像的标准解决方
  • 如何使用表达式树调用带有引用变量的方法

    我试图弄清楚如何创建一个调用具有引用参数的方法的表达式 让我用一个简单 但人为的 例子来解释我的问题 考虑方法 public static int TwiceTheInput int x return x 2 我可以创建一个表达式来通过执行