gpt4 book ai didi

.net - 是否有工具可以简化 Reflection.Emit 的工作?

转载 作者:行者123 更新时间:2023-12-01 11:09:28 24 4
gpt4 key购买 nike

我需要动态生成一些类型。生成的类型有几个方法、构造函数、实现接口(interface)并定义静态构造函数。有没有可以帮助完成任务的工具?

我知道 this Reflector 的插件,但它只在方法级别有用,而我必须生成一个完整的类型。

Run# ,但它处于 pre-alpha 阶段,此外,我想要一个独立的工具在离线模式下工作,这样我就可以将 reflection.emit 指令复制粘贴到生产代码中。

最佳答案

嗯,我个人在 ILGenerator 类上创建了扩展方法,其名称与操作码相同,参数正确,这样我就不必一直查找文档.这些扩展方法还返回调用它的生成器对象,因此我可以进行调用链接。

例如,要实现 ToString 方法,我可以这样做:

var il = method.GetILGenerator();
il
.ldarg_0()
.ldfld(nameField)
.ret();

我还创建了一个名为 IL 的类似类,它具有返回 IL.Element 对象的方法,我可以在最终发出代码之前将其收集到一个集合或类似的集合中,进行操作等。这使我能够创建“代码生产者”而不仅仅是“代码发射者”。细微差别,但我发现“给我可以发出的代码”比“将代码发出到这个 ILGenerator”更有用。

因此,我可以这样做:

IL.Element[] il = new IL.Element[] {
IL.ldarg_0(),
IL.ldfld(nameField),
IL.ret()
};

然后:

method.GetILGenerator.Emit(il); // also an extension method

当然,我已经添加了一些额外的扩展方法,使我也更容易发出代码,例如“call_smart”,它根据方法的类型(静态的)确定发出哪些调用指令、虚拟等)。

除此之外,我不知道任何其他工具,所以也许我没有真正回答您的问题。

The code is available on CodePlex .

关于.net - 是否有工具可以简化 Reflection.Emit 的工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1594248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com