gpt4 book ai didi

c# - Reflection.Emit 与 CodeDOM

转载 作者:IT王子 更新时间:2023-10-29 03:51:10 24 4
gpt4 key购买 nike

使用 Reflection.Emit 库与 CodeDOM 在运行时动态生成代码有哪些优缺点?

我正在尝试根据运行时以 XML 形式提供的元数据在系统中生成一些(相对复杂的)动态类。我将生成扩展应用程序集中现有类的类,实现额外的接口(interface),添加方法,并覆盖虚拟和抽象成员。

我想确保在深入实现之前选择了合适的技术。有关这些不同的代码生成技术有何不同的任何信息都会有所帮助。此外,任何有关简化或流线化使用任一 API 的开源库的信息也很有用。

最佳答案

我认为关于 CodeDOM 和 Reflection.Emit 的关键点如下:

  • CodeDom 生成 C# 源代码,通常在生成要作为解决方案的一部分并在 IDE 中编译的代码时使用(例如,LINQ to SQL 类、WSDL、XSD都是这样工作的)。在这种情况下,您还可以使用分部类来自定义生成的代码。它的效率较低,因为它生成 C# 源代码,然后运行编译器来解析它(再次!)并编译它。您可以使用循环等相对高级的构造(类似于 C# 表达式和语句)生成代码。

  • Reflection.Emit 生成一个 IL,因此它直接生成一个程序集,该程序集也只能存储在内存中。结果效率更高。您必须生成低级 IL 代码(值存储在堆栈中;循环必须使用跳转来实现),因此生成任何更复杂的逻辑都有点困难。

总的来说,我认为 Reflection.Emit 通常被认为是在运行时生成代码的首选方式,而在编译前生成代码时首选 CodeDOM。在您的场景中,它们可能都可以正常工作(尽管 CodeDOM 可能需要更高的权限,因为它实际上需要调用 C# 编译器,这是任何 .NET 安装的一部分)。

另一种选择是使用 Expression class .在 .NET 4.0 中,它允许您生成等效于 C# 表达式和语句的代码。但是,它不允许您生成类。因此,您可以将其与 Reflection.Emit 结合使用(以生成将实现委托(delegate)给使用 Expression 生成的代码的类)。对于某些场景,您可能真的不需要完整的类层次结构——通常是动态生成的委托(delegate)字典,例如 Dictionary<string, Action>可能已经足够好了(当然,这取决于您的具体情况)。

关于c# - Reflection.Emit 与 CodeDOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2366921/

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