【问题标题】:How to change class definition on runtime?如何在运行时更改类定义?
【发布时间】:2011-02-15 11:09:22
【问题描述】:

有没有办法让我在运行时更改类的属性(添加/删除属性)?

【问题讨论】:

  • 真正的问题是你为什么要这样做?您可能正在解决错误的问题。
  • @GenericTypeTea 学术问题 :) (不是作业,只是我和一些朋友讨论这个可能性)
  • 啊,那是小仙女!学术走开。
  • download.oracle.com/javase/1.4.2/docs/guide/jpda/… :“工具 (IDE) 供应商希望能够进行修复并继续调试。也就是说,在调试时,发现问题,修复它,然后使用固定代码继续调试。部署长期运行服务器的组织希望能够在不关闭服务器的情况下修复错误。”

标签: c# .net


【解决方案1】:

您可以在运行时使用 System.Reflection.Emit -link 创建您的类型

【讨论】:

    【解决方案2】:

    如果您在 3.5 上,您可以使用 IL 创建动态类型,并完成任务,但这要困难得多,但我想有一些框架可以做到这一点。

    【讨论】:

    • 动态代码注入,实际上我正在为此做一个框架。您可以定义一些 C# 属性,然后将代码注入您想要的位置。这有利于关注点分离。
    【解决方案3】:

    对于 UI 开发(即呈现给最终用户的内容),请查看实现 ICustomTypeDescriptor(在 System.ComponentModel 中)。许多控件都知道这个接口,并将使用它来查询实例或类型公开的属性。

    【讨论】:

      【解决方案4】:

      添加到 Andrew Hare 的回复中:使用 C# 4 和 .NET 4,您可以从 DynamicObject 继承并重新定义对类型的实例执行各种操作的含义。 DynamicObject 定义了许多虚拟方法,您可以覆盖这些方法来控制它的含义,例如访问属性。您可以使用它来允许向实例添加/删除属性,这几乎就是 ExpandoObject 所做的。

      有关ExpandoObject 的更多信息,请参阅this questionthis blog post

      【讨论】:

        【解决方案5】:

        除非您正在使用ExpandoObject 的实例,否则您无法执行此操作。 CLR 类型的元数据在程序集中是固定的,不能在执行时更改。如果你真的需要这种动态行为,你必须使用支持这种行为的动态类型(如EpandoObject)。

        【讨论】:

        • 我以前从未听说过ExpandoObject,我很高兴我的同事也从未听说过。
        猜你喜欢
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 2022-12-03
        • 2019-05-23
        • 2015-07-11
        • 2020-10-29
        • 2014-06-08
        • 1970-01-01
        相关资源
        最近更新 更多