Dot-Net
是否可以在 .NET 中在執行時修改方法體?
我知道(理論上)可以在執行時創建新類型,但是是否可以在執行時修改現有類型的方法體?我的計劃(如果我可以讓它工作的話)是用自定義屬性標記方法,然後在執行時搜尋具有該屬性的方法,並將我自己的一些程式碼插入到方法體中。
有什麼建議麼?
我想如果我不能讓這種方法發揮作用,我總是可以使用基類中的虛擬方法(帶有屬性),結合靜態工廠來使用我的執行時生成的方法生成派生的動態類型在兒童班。不過,這用起來不太乾淨。
PostSharp是一個後編譯器,與您描述的內容類似,使用屬性在程式碼中標記註入點,唯一的區別是它在編譯時執行。
但是您也可以在執行時執行此操作,而不是通過更改方法主體,而是使用派生自ContextBoundObject的類,這是一個 .Net 類,可讓您攔截對其進行的所有呼叫。這是一篇MSDN 雜誌文章,描述瞭如何使用 ContextBoundObject 進行 AOP。(檢查文章*.Net*部分中的方面)
作為第三種選擇,您可以將動態程式碼生成(Reflection.Emit 或 CodeDom)與屬性和虛擬方法結合使用,以動態生成可以插入程式碼的派生類,但這是最痛苦的方法。
編輯:
還有第四個選項是使用.Net 非託管分析 API來攔截方法 JIT-ing 並在 JIT-ing 之前替換方法主體。JustMock (Telerik) 成功地使用這種技術來模擬、靜態方法、非虛擬方法甚至密封類。