【问题标题】:Creating C# Classes at runtime在运行时创建 C# 类
【发布时间】:2010-04-17 19:38:24
【问题描述】:

我一直对在 C# 中在运行时动态创建类感到好奇,并偶然发现了这篇文章。 http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html 我很想听听一些关于在运行时构建类的利弊。

有什么意见吗?

【问题讨论】:

  • 对这个问题的补充?您可以将在运行时使用反射创建的代码保存到程序集中吗?这样就不用重新创建了?
  • 是的,实际上您提供的链接已经保存了生成的代码。
  • 哈哈。有趣的是,它是该代码的最后一部分。显示我有多注意。对此感到抱歉。

标签: c# .net


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢大家的意见。
【解决方案2】:

这不是利弊的问题。

有时,基于难以以其他方式转换为代码的信息或直到运行时才可用的信息来创建类是很方便的。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您可能已经有使用运行时生成的类的经验。泛型是在 CLR 运行时在第一次需要时构建的。 XmlSerializer 的实现也是如此。

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

          我想到的一个缺点是内存使用。如果您在每次收到请求时动态构建一个类来处理某些请求,那么您将冒着每次为相同的值生成一个新类的风险。一旦类或程序集加载到应用程序域中,就无法卸载它。所以,尽量缓存生成的程序集和类。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-11-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多