将对象字面量提供给 ILGenerator

2023-11-23

Food obj = ...;
ILGenerator gen = (...).GetILGenerator();
gen.Emit( ?? obj ?? ); // replace this 
gen.Emit(OpCodes.Call, typeof(Person).GetMethod("Eat"));

显然不可能将 obj 干净地推入评估堆栈,但我对丑陋的黑客持开放态度,这可能会损害例如可移植性。 ModuleBuilder.DefineInitializedData 允许在 .sdata 中存储 System.Byte[]。有任何想法吗?

编辑:生成的方法作为新程序集的一部分发出。


object o = ...;
Func<object> sneaky = () => o;
gen.Emit(OpCodes.Call, sneaky.Method);

另外,请确保您不能将 System.Linq.Expressions 用于您的目的。这是我之前和之后在 ANTLR 项目中的一段代码:

前。请注意,其中有一个错误(无法找到有关它的邮件列表帖子),我不必找到它,因为切换到“之后”纠正了它作为副作用。

private static Func<object, object> BuildAccessor(MethodInfo method)
{
    DynamicMethod dm = new DynamicMethod(method.DeclaringType.Name + method.Name + "MethodAccessor", typeof(object), new Type[] { typeof(object) }, method.DeclaringType);
    var gen = dm.GetILGenerator();

    if (!method.IsStatic)
    {
        gen.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
        gen.Emit(System.Reflection.Emit.OpCodes.Castclass, method.DeclaringType);
    }

    if (method.IsVirtual && !method.IsFinal)
        gen.EmitCall(System.Reflection.Emit.OpCodes.Callvirt, method, null);
    else
        gen.EmitCall(System.Reflection.Emit.OpCodes.Call, method, null);

    if (method.ReturnType.IsValueType)
        gen.Emit(System.Reflection.Emit.OpCodes.Box, method.ReturnType);

    gen.Emit(System.Reflection.Emit.OpCodes.Ret);
    return (Func<object, object>)dm.CreateDelegate(typeof(Func<object, object>));
}

private static Func<object, object> BuildAccessor(FieldInfo field)
{
    DynamicMethod dm = new DynamicMethod(field.DeclaringType.Name + field.Name + "FieldAccessor", typeof(object), new Type[] { typeof(object) }, field.DeclaringType);

    var gen = dm.GetILGenerator();
    if (field.IsStatic)
    {
        gen.Emit(System.Reflection.Emit.OpCodes.Ldsfld, field);
    }
    else
    {
        gen.Emit(System.Reflection.Emit.OpCodes.Ldarg_0);
        gen.Emit(System.Reflection.Emit.OpCodes.Castclass, field.DeclaringType);
        gen.Emit(System.Reflection.Emit.OpCodes.Ldfld, field);
    }

    if (field.FieldType.IsValueType)
        gen.Emit(System.Reflection.Emit.OpCodes.Box, field.FieldType);

    gen.Emit(System.Reflection.Emit.OpCodes.Ret);
    return (Func<object, object>)dm.CreateDelegate(typeof(Func<object, object>));
}

After:

private static Func<object, object> BuildAccessor(MethodInfo method)
{
    ParameterExpression obj = Expression.Parameter(typeof(object), "obj");

    Expression<Func<object, object>> expr =
        Expression.Lambda<Func<object, object>>(
            Expression.Convert(
                Expression.Call(
                    Expression.Convert(obj, method.DeclaringType),
                    method),
                typeof(object)),
            obj);

    return expr.Compile();
}

private static Func<object, object> BuildAccessor(FieldInfo field)
{
    ParameterExpression obj = Expression.Parameter(typeof(object), "obj");

    Expression<Func<object, object>> expr =
        Expression.Lambda<Func<object, object>>(
            Expression.Convert(
                Expression.Field(
                    Expression.Convert(obj, field.DeclaringType),
                    field),
                typeof(object)),
            obj);

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

将对象字面量提供给 ILGenerator 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 使用 C# 读取 Soap 消息

  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • 如何突出显示 ggplot 上的方差?

    我不知道该如何提出这个问题 所以我使用了这个方法 我有一个经纬度数据集 下面发布的图像是我想要生成的 这是我的数据集 Latitude Longitude 21 06941667 71 07952778 21 06941667 71 079
  • 以编程方式获取设备的 Android API 级别?

    如何查明我的设备正在使用哪个 API 级别 固件版本为1 6 这是否意味着它使用 API 级别 4 您可以通过系统常量 Build VERSION SDK INT 例如 您可以通过以下方式运行一些需要更新 API 的代码 如果当前设备的 A
  • 如何将字符串的第一个字母大写

    我有一个像这样的字符串 var sentence string the biggest ocean is the Pacific ocean 我希望能够将第一个字母大写t在输入字符串中 使该字符串变为 The biggest ocean i
  • Paypal 可变金额定期付款

    首先 请注意 我已经阅读了许多有关此主题的帖子 但提供的信息对我来说不够或不准确 我正在使用 AngularJS 和 Ruby on Rails 开发一个提供不同服务的网站 用户可以订阅这些服务 一项或多项 并获得 Paypal 定期付款
  • YYYYMMDD 日期格式正则表达式以验证 C# .net 中的日期

    我需要在 C 中使用正则表达式验证日期格式 格式如下 YYYYMMDD 正则表达式不适合此任务 例如 编写匹配有效日期 20080229 但不匹配无效日期 20100229 的正则表达式是很困难的 相反 你应该使用DateTime TryP
  • RNN:Keras框架中LSTM层的return_sequences有什么用

    我在 RNN 工作 我有来自某个网 站的以下代码行 如果您观察到第二层没有 returnSequence 参数 我假设返回序列是强制性的 因为它应该返回序列 您能告诉我为什么没有定义吗 第一层LSTM regressor add LSTM
  • valgrind 条件跳转或移动取决于未初始化的值,这是否表明内存泄漏?

    我在代码中面临内存泄漏问题 在运行时 堆继续增加到最大值 我需要重新启动服务 我运行 top 命令并看到每当我调用服务中的场景时堆都会增加 我用 valgrind 运行服务 valgrind log file log feb19 txt l
  • DLL 总是有相同的基地址吗?

    我正在研究 Windows 和 DLL 的东西 我对此有一些疑问 我编写了一个简单的程序来加载我自己的 DLL 这个DLL只有简单的函数 加号 减号 这就是问题 如果我加载一些 DLL 例如 text dll 这个DLL总是有相同的基地址吗
  • PHP https 使用 cURL 发布 XML 数据

    我正在尝试使用 PHP 将带有 XML 数据的 HTTPS POST 请求发送到服务器 发送到服务器的任何内容都需要身份验证 因此我将使用 cURL 一些背景信息 XML数据是请求服务器将文件从特定URL上传到其本地存储 使用此 API 的
  • 禁用或启用复选框选中事件上的提交按钮

    我想要这样的东西 但有一点小小的改变 我希望在复选框选中事件上启用或禁用按钮 即当选中复选框时 然后只应启用按钮 否则将被禁用 这应该使用 jQuery 代码而不是 JavaScript 来完成 由于这是 MVC 表单 因此没有表单 ID
  • 使用 javascript 和 regex 验证日期时间

    我正在尝试使用有效的日期时间格式验证文本框 我需要检查 24 小时日期时间格式 所以我将以下文本输入到我的文本框中22 05 2013 11 23 22 但它仍然无法正确验证它 我对正则表达式完全陌生 这是到目前为止我已经尝试过的 test
  • 如何以编程方式将文本添加到位图图像? WPF

    我使用 Kinect 传感器通过将视频源设置为位图源来在图像上显示视频源 如下所示 但我的问题是如何向图像 位图添加文本 例如分数计数器 我在下面添加了一张图片来显示我想要实现的目标 void myKinect ColorFrameRead
  • 将属性与父 ViewModel 绑定

    请参阅如何告诉我的 DataTemplate 绑定到 PARENT ViewModel 中的属性 我有类似的问题 但这个解决方案对我不起作用 我有一个 MainViewModel 它有另一个视图模型 例如 View1 ViewModel1
  • 固定标题 div 和下面的可滚动 div

    我试图将两个 div 一个放在另一个上面 最上面的一个有固定的大小 底部的需要填充页面高度的其余部分 如果内容太大 则不会使页面更高 div div div div some content br br br br br br br br
  • 触摸时旋转视图

    我必须在手指触摸时循环旋转视图 我的意思是像拨打旧电话号码 并且触摸应该只在角落 任何人都可以帮助我 我已经尝试过一次很多 但没有成功 您需要定义UIRotationGestureRecognize在要旋转的视图上添加一个选择器方法并像这样
  • 默认浮点类型是什么?

    如果在变量上指定浮点类型a the abs可以使用函数 以下示例正在运行 fn main let a 1 0f64 println a abs 它打印1正如预期的那样 但如果f64省略时 编译期间会引发错误 如下例所示 fn main le
  • 如何获取自定义元素的内容

    我正在创建一个自定义元素它将能够将其内容从 Markdown 转换为 HTML 但是 我无法获取自定义元素的内容
  • 邮寄地址和格式(粗体、斜体……)

    我想用特定文本打开用户的邮件客户端 文本的某些部分应该是bold italic或 u n d e r l i n e d 我尝试使用mailto 但它使用的是RFC 2368 所以这是根本不可能的 特殊的hname body 表示关联的hv
  • requestAnimationFrame 未定义 Next.js 和 React Native Web(动画模块)

    我正在研究 Next js 和 React Native Web 我设法按照官方 Next js 示例将它们一起运行 但是当我尝试使用反应本机中的动画包时 它失败并出现错误 请求动画帧没有定义 基本上这个功能执行node modules包
  • 将对象字面量提供给 ILGenerator

    Food obj ILGenerator gen GetILGenerator gen Emit obj replace this gen Emit OpCodes Call typeof Person GetMethod Eat 显然不可