【发布时间】:2011-01-17 11:00:38
【问题描述】:
我有一个基类,它定义了(除其他外)某个空虚方法(用作事件处理程序)。
到目前为止,所有实例都是从派生类型创建的,该派生类型会覆盖虚方法以使其充满生命。这种类型是动态生成的,它应该做的一切,但我真的想知道反射 (.Emit) 或 .Net 框架必须提供的任何杠杆是否可以只修改上述方法的主体。
有什么想法吗?
提前致谢!
【问题讨论】:
标签: c# reflection dynamic proxy
我有一个基类,它定义了(除其他外)某个空虚方法(用作事件处理程序)。
到目前为止,所有实例都是从派生类型创建的,该派生类型会覆盖虚方法以使其充满生命。这种类型是动态生成的,它应该做的一切,但我真的想知道反射 (.Emit) 或 .Net 框架必须提供的任何杠杆是否可以只修改上述方法的主体。
有什么想法吗?
提前致谢!
【问题讨论】:
标签: c# reflection dynamic proxy
您可以让主体调用委托,然后更改委托,而不是将方法设为虚拟并覆盖它。
如果该方法的唯一用途是作为事件处理程序,那为什么要让它成为一个方法呢?只需将生成的函数直接分配给事件处理程序即可。
您可以构造一个表达式树,然后将其编译为一个委托,然后您可以将其分配给事件处理程序。
【讨论】:
与其尝试填充方法体,不如直接将委托传递给构造函数?动态构建委托相对容易(例如使用DynamicMethod.CreateDelegate),然后您无需担心修改现有类型。
【讨论】:
据我所知,现有代码编译后是禁止修改的。您可以动态添加新代码,但不允许更改现有代码,这既适用于编译的命令,也适用于类或其他数据类型的定义。
【讨论】: