2009-06-12 39 views
1

我想找出一種方法來使用Reflection.Emit命名空間來刪除​​一個字段,並將其替換爲我自己的屬性實現。我一直在閱讀如何使用Emit生成代碼並直接編寫和編譯IL代碼,但我還沒有看到有關如何使用Reflection.Emit命名空間進行替換或刪除的示例;任何人都可以向我展示任何沿着這些線條的例子嗎?使用System.Reflection.Emit命名空間替換字段屬性?

謝謝。

回答

2

據我所知在CLR中這是不可能的。我甚至不認爲你可以修改一個類型,一旦它被加載。根據計劃使用屬性的方式,可以使用自定義的TypeDescriptor(組件使用它來動態擴展Windows窗體中的ToolTip組件等屬性),也可以使用DependencyProperty。但是,對於普通的舊的晚期綁定到一個新的或修改的加載類型成員,我不認爲這是可能的。

爲什麼不使用Assembly.ReflectionOnlyLoadFrom加載DLL之前加載組件插入的AppDomain然後發射類型與所述動態地生成的類型在存儲器中,然後加載?

+0

我工作的一個屬性網格類型控件,還可以修改字段,哈希表,等等。但是,我現在還沒有被通知的任何方式,當一個領域,或者基本上什麼修改超出我的控制期望的屬性。所以當用戶在我的控件上設置選定的對象時,我想進入並替換一個屬性的字段,並定義一些通知的邏輯......它是一個遠射,但有一定要做到這一點...... – Thrash505 2009-06-12 21:29:12

+0

IPropertyChanged是一個概念。 http://www.msnewsgroups.net/group/microsoft.public.dotnet.languages.csharp/topic36704.aspx – eschneider 2009-06-12 21:37:53

1

你可能試着尋找帶有Postharp的Aspect Oriented Programming。

我從來沒有使用Postsharp,所以我沒有具體的想法,你可能會完成這個。然而,這聽起來與我聽說可以用Postharp做的一些事情(設置代碼來運行屬性或字段的前/後訪問)聽起來驚人地相似。

http://www.postsharp.org/