代码之家  ›  专栏  ›  技术社区  ›  DuckMaestro

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

  •  12
  • DuckMaestro  · 技术社区  · 17 年前

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

    有什么建议吗?

    我想如果我不能让这种方法工作,我可以在一个基类中使用一个虚拟方法(带有属性),再结合一个静态工厂,用我在子类中的运行时生成的方法吐出一个派生的动态类型。不过,使用起来就不那么干净了。

    5 回复  |  直到 14 年前
        1
  •  9
  •   Pop Catalin    14 年前

    PostSharp 这是一个后编译器,它做一些类似于您描述的事情,使用属性在代码中标记注入点,唯一的区别是它在编译时做。

    但您也可以在运行时这样做,而不是通过更改方法体,而是通过使用派生自 ContextBoundObject 它是一个.NET类,允许您截取针对它的所有调用。这里是一个 MSDN Magazine article 描述如何使用ContextBoundObject执行AOP。(检查 NET中的几个方面 文章的一部分)

    作为第三种选择,您可以将动态代码生成(reflection.emit或codedom)与属性和虚拟方法结合使用,在可以插入代码的地方动态生成派生类,但这是最痛苦的方法。

    编辑:

    有第四种选择 .Net unmanaged profiling API 截取方法抖动并在抖动前替换方法体。 这种技术被justmock(telerik)成功地用于模拟、静态方法、非虚拟方法甚至密封类。

        2
  •  3
  •   Timothy Khouri    17 年前

    您不能在运行时修改现有的方法,但是您可以动态创建一个带有代码dom的方法并执行它。或者,您可以将代码串合并在一起,在内存中编译并运行它。

    我自己也做了后者(一个我允许在内存、运行时编译和执行自定义C代码的应用程序)。

        3
  •  2
  •   mmiika    17 年前

    如果您希望在调用前或调用后添加方面,请查看postsharp: http://www.postsharp.org/

        4
  •  1
  •   Community Mohan Dere    8 年前

    somewhat similar question 之前有人问过(好吧,所以我的解决方案有点相似)。 PostSharp 已经提到了,但也有非常适用的 LinFu article on CodeProject 我在研究这个问题时发现很有趣。

        5
  •  0
  •   Peter    17 年前

    您是否计划对任意类型执行此操作?我不认为您要用一个属性来修饰这些方法。

    考虑到这一点,我认为更好的方法是在一个超类中为您的类型定义抽象方法。超级类上的一个方法可以包含锅炉板方法代码,并通过抽象方法委托给具体的实现,以实现该方法的单个类型的行为。

    不过,一般来说,除非您在运行时着手创建代码文件和编译动态程序集,否则无法完成您要做的工作。可能有更多实际的OO原则和模式可以用来实现接近相同的结果。