在运行时创建C#类

我一直很好奇在C#中动态创建类,并偶然发现了这篇文章。 http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html我很想知道在运行时构建类的一些优点和缺点。

任何意见?

元编程具有构建时代码生成的所有优点,但没有额外的代码步骤。 这在库代码中非常常见,例如ORM,序列化器,某些类型的AOP,DI / IoC容器等。

  • +避免需要额外的构建步骤或编写普通代码
  • +这样的代码可以处理运行时的实际情况,而不必处理包装器周围的任何不常见的边缘情况或大量包装器(装饰器模式)
  • +允许在仅在运行时知道元数据的场景中的codegen
  • +运行时IL可以访问私有字段等,这要归功于DynamicMethod如何与一个类型相关联; 完全生成(dll)代码需要[InternalsVisibleTo]或类似,这可能是不可能的
  • – 并非所有系统都支持运行时代码; 它在某些服务器设置,紧凑框架,iPhone等上被禁用
  • – 做丑陋丑陋 。 无论你如何做,这都不是正常的代码。
  • – 它需要非常好地理解事物的实际工作方式
  • +如果迫使你非常了解事情的实际工作方式

我目前正在重写现有的库以使用运行时IL生成; 这是非常有益的,我很高兴; 但它不像我以前写过的任何东西

这不是利弊。

有时,基于以另一种方式转换为代码的繁琐信息或者在运行时之前不可用的信息来创建类是方便的。

链接文章中的示例不是 (作为应用程序员)通常会做的事情。 但它在工具中很有用,例如,它可以基于数据库或XML模式生成类。

一切都有时间和地点,包括这个(例如,generics)。 但是,在我继续执行之前,我会考虑在运行时生成类的替代方法。 最有可能更好,更容易维护生成类的替代方法。

您可能已经具有运行时生成的类的经验。 当首次需要时,generics是在CLR的运行时构建的。 XmlSerializer的实现也是如此。

在运行时从头开始构建类可能非常难看(除非你喜欢查看很多reflection和Code Dom代码)。 这是一种罕见的情况,这是最清晰,最简单的解决方案。

优点:您可以在运行时创建所需的任何内容。

缺点:你没有编译时检查,所以如果出现任何问题,一切都会爆炸。

基本上与使用Reflection的优点/缺点相同。

想到的一个问题是内存使用情况。 如果每次收到请求时动态构建一个类来处理某些请求,那么每次都会冒着为相同值生成新类的风险。 将类或程序集加载到app域后,就无法卸载它。 因此,尽可能尝试缓存生成的程序集和类。