在运行时创建C#类

时间:2010-04-17 19:38:25

标签: c# .net

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

有什么意见吗?

6 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:6)

这不是利弊。

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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