在运行时定义C#方法体(动态)

时间:2011-01-17 11:00:39

标签: c# reflection dynamic proxy

我有一个基类,用于定义(以及其他)某个空虚拟方法(用作事件处理程序)。

到目前为止,所有实例都是从派生类型创建的,它会覆盖虚拟方法以填充生命。这种类型是动态生成的,并且可以完成所有这些,但我真的很想知道反射(.Emit)或.Net框架提供的任何杠杆是否可以只修改上述方法的主体。

有什么想法吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

为什么不直接将委托传递给构造函数?动态构建代理相对容易(例如使用DynamicMethod.CreateDelegate),然后您无需担心修改现有类型。

答案 2 :(得分:0)

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