我一直很好奇在C#中动态创建类,并偶然发现了这篇文章。 http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html我很想知道在运行时构建类的一些优点和缺点。
有什么意见吗?
答案 0 :(得分:20)
元编程具有构建时代码生成的所有优点,但没有额外的代码步骤。这在库代码中很常见,例如ORM,序列化器,某些类型的AOP,DI / IoC容器等。
DynamicMethod
如何与一个类型相关联;完全生成(dll)代码需要[InternalsVisibleTo]
或类似,这可能是不可能的我目前正在重写现有的库以使用运行时IL生成;这是非常有益的,我很高兴;但它不像我之前写过的任何。
答案 1 :(得分:6)
这不是利弊。
有时,基于以另一种方式转换为代码的繁琐信息或者直到运行时才可用的信息来创建类是很方便的。
链接文章中的示例不是你(作为应用程序员)通常会做的事情。但它在工具中很有用,例如,它可以基于数据库或XML模式生成类。
答案 2 :(得分:2)
所有事情都有时间和地点,包括这个(例如,泛型)。但是,在我继续执行之前,我会考虑在运行时生成类的替代方法。最有可能更好,更容易维护生成类的替代方法。
答案 3 :(得分:0)
您可能已经具有运行时生成的类的经验。当首次需要时,泛型是在CLR的运行时构建的。 XmlSerializer的实现也是如此。
在运行时从头开始构建类可能非常难看(除非你喜欢查看很多反射和Code Dom代码)。这是一种罕见的情况,这是最清晰,最简单的解决方案。
答案 4 :(得分:0)
优点:您可以在运行时创建所需的任何内容。
缺点:您没有编译时检查,所以如果出现任何问题,一切都会爆炸。
与使用Reflection的优点/缺点基本相同。
答案 5 :(得分:0)
让人想起的一个问题是内存使用情况。如果每次收到请求时动态构建一个类来处理某些请求,那么每次都会冒着为相同值生成新类的风险。将类或程序集加载到app域后,就无法卸载它。因此,尽可能尝试缓存生成的程序集和类。