【问题标题】:Defining a C# Method Body at runtime (dynamically)在运行时定义 C# 方法体(动态)
【发布时间】:2011-01-17 11:00:38
【问题描述】:

我有一个基类,它定义了(除其他外)某个空虚方法(用作事件处理程序)。

到目前为止,所有实例都是从派生类型创建的,该派生类型会覆盖虚方法以使其充满生命。这种类型是动态生成的,它应该做的一切,但我真的想知道反射 (.Emit) 或 .Net 框架必须提供的任何杠杆是否可以只修改上述方法的主体。

有什么想法吗?

提前致谢!

【问题讨论】:

    标签: c# reflection dynamic proxy


    【解决方案1】:

    您可以让主体调用委托,然后更改委托,而不是将方法设为虚拟并覆盖它。

    如果该方法的唯一用途是作为事件处理程序,那为什么要让它成为一个方法呢?只需将生成的函数直接分配给事件处理程序即可。

    您可以构造一个表达式树,然后将其编译为一个委托,然后您可以将其分配给事件处理程序。

    【讨论】:

    • 谢谢,我想你是对的——我可以调用事件,而不是调用现有的方法。派生类可以为这些事件指定监听器,所以它会干净漂亮!感谢您的意见!
    【解决方案2】:

    与其尝试填充方法体,不如直接将委托传递给构造函数?动态构建委托相对容易(例如使用DynamicMethod.CreateDelegate),然后您无需担心修改现有类型。

    【讨论】:

      【解决方案3】:

      据我所知,现有代码编译后是禁止修改的。您可以动态添加新代码,但不允许更改现有代码,这既适用于编译的命令,也适用于类或其他数据类型的定义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多