使用Reflection.Emit库相对于CodeDOM在运行时动态生成代码有哪些优缺点?
我试图在基于运行时XML形式的元数据的系统中生成一些(相对复杂的)动态类。我将生成扩展应用程序集中现有类的类,实现其他接口、添加方法以及覆盖虚拟和抽象成员。
在深入实现之前,我需要确保选择合适的技术。任何关于这些不同的代码生成技术有何不同的信息都是有帮助的。此外,任何关于简化或简化工作的开源库的信息都会对任何一个API都很有用。
发布于 2010-03-02 22:54:43
我认为CodeDOM和Reflection.Emit的要点如下:
一般来说,我认为Reflection.Emit通常被认为是在运行时生成代码的首选方式,而在编译前生成代码时,CodeDOM则是首选的方法。在您的场景中,两者都可能工作得很好(尽管CodeDOM可能需要更高的权限,因为它实际上需要调用C#编译器,这是任何.NET安装的一部分)。
另一种选择是使用Expression class。在.NET 4.0中,它允许您生成相当于C#表达式和语句的代码。但是,它不允许生成类。因此,您可以将其与Reflection.Emit结合起来(生成将实现委托给使用Expression生成的代码的类)。对于某些场景,您可能并不真正需要完整的类层次结构--通常,动态生成的委托字典(如Dictionary<string, Action> )可能足够好(当然,这取决于您的确切场景)。
发布于 2010-03-02 22:56:42
针对CodeDom的代码更容易维护,因为您生成的是C#代码,而不是IL (比IL更多的人可以读取C# )。此外,如果您的CodeDom代码出错,您将得到一个编译器错误;如果您生成无效的IL,您将得到一个致命的异常或崩溃。
但是,由于CodeDom调用了csc.exe编译器,所以要准备好使用代码有点慢。使用Reflection.Emit,您可以直接将代码生成到内存中。
在大多数情况下,CodeDom可能都很好;XmlSerializer和WinForms设计人员使用它。
发布于 2010-03-02 21:35:08
您可能想看看ExpandoObject。不过,它只是.NET 4.0。
https://stackoverflow.com/questions/2366921
复制相似问题