我知道(在理论上)可以在运行时创建一个新类型,但是可以在运行时修改现有类型的方法体吗?我的计划(如果我可以让它工作)是使用自定义属性标记方法,然后在运行时搜索具有该属性的方法,并将我自己的一些代码插入到方法体中.
有什么建议?
我想如果我不能使用这种方法,我总是可以使用基类中的虚方法(带有属性),结合静态工厂使用我的运行时生成的方法吐出派生的动态类型在儿童班.尽管如此,这并不是那么干净.
PostSharp是一个后编译器,它使用类似于你描述的内容,使用属性在代码中标记注入点,唯一的区别是它在编译时执行.
但是你也可以在运行时不是通过改变方法体,而是使用从ContextBoundObject派生的类,它是一个.Net类,它允许你拦截对它做出的所有调用.这是一篇MSDN杂志文章,描述了如何使用ContextBoundObject执行AOP.(查看文章的.Net部分内容)
作为第三个选项,您可以将动态代码生成(Reflection.Emit或CodeDom)与属性和虚拟方法结合使用,以动态生成可以插入代码的派生类,但这是最痛苦的方法.
编辑:
有一个第四种选择,可以使用.Net非托管分析API拦截方法JIT,并在JIT之前替换方法体.JustMock(Telerik)成功地使用了这种技术,以模拟,静态方法,非虚方法甚至密封类.