当前位置:  开发笔记 > 编程语言 > 正文

是否可以在.NET中的运行时修改方法体?

如何解决《是否可以在.NET中的运行时修改方法体?》经验,为你挑选了1个好方法。

我知道(在理论上)可以在运行时创建一个新类型,但是可以在运行时修改现有类型的方法体吗?我的计划(如果我可以让它工作)是使用自定义属性标记方法,然后在运行时搜索具有该属性的方法,并将我自己的一些代码插入到方法体中.

有什么建议?

我想如果我不能使用这种方法,我总是可以使用基类中的虚方法(带有属性),结合静态工厂使用我的运行时生成的方法吐出派生的动态类型在儿童班.尽管如此,这并不是那么干净.



1> Pop Catalin..:

PostSharp是一个后编译器,它使用类似于你描述的内容,使用属性在代码中标记注入点,唯一的区别是它在编译时执行.

但是你也可以在运行时不是通过改变方法体,而是使用从ContextBoundObject派生的类,它是一个.Net类,它允许你拦截对它做出的所有调用.这是一篇MSDN杂志文章,描述了如何使用ContextBoundObject执行AOP.(查看文章的.Net部分内容)

作为第三个选项,您可以将动态代码生成(Reflection.Emit或CodeDom)与属性和虚拟方法结合使用,以动态生成可以插入代码的派生类,但这是最痛苦的方法.

编辑:

有一个第四种选择,可以使用.Net非托管分析API拦截方法JIT,并在JIT之前替换方法体.JustMock(Telerik)成功地使用了这种技术,以模拟,静态方法,非虚方法甚至密封类.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有