我一直很好奇在C#中運行時動態創建類,並偶然發現這篇文章。 http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html我很好奇聽到關於在運行時構造類的一些優點和缺點。在運行時創建C#類
有沒有意見?
我一直很好奇在C#中運行時動態創建類,並偶然發現這篇文章。 http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html我很好奇聽到關於在運行時構造類的一些優點和缺點。在運行時創建C#類
有沒有意見?
元編程具有構建時代碼的優點,但沒有額外的代碼步驟。這在庫代碼中非常常見,例如ORM,序列化程序,某些類型的AOP,DI/IoC容器等。
DynamicMethod
可以與類型相關聯多個接入;完全生成(dll)代碼將需要[InternalsVisibleTo]
或類似的,這可能是不可能的我目前重新 - 寫入現有庫以使用運行時IL生成;這是非常有益的,我很高興;但它不像什麼我以前寫過。
謝謝大家的意見。 – 2010-04-19 01:04:51
您可能已經有運行時生成的類的經驗。泛型是在運行時在CLR中構建的,當他們第一次需要時。 XmlSerializer的實現也是如此。在運行時從頭建立類很可能非常難看(除非你喜歡看很多反射和代碼Dom代碼)。這是一個罕見的情況,這是最清晰和最簡單的解決方案。
優點:你可以在運行時創建任何需要的東西。
缺點:你沒有編譯時檢查,所以如果出現任何問題,一切都會爆炸。
基本上與使用反射的優點/缺點相同。
這不是正反兩方面的問題。
有時候,根據冗長的信息創建類是很方便的,這些信息以另一種方式轉換爲代碼,或者直到運行時纔可用。
鏈接文章中的示例不是您(作爲應用程序員)通常會執行的操作。但它對於例如基於數據庫或XML模式生成類的工具很有用。
有一段時間和一切的地方,包括這個(例如,泛型)。不過,我會考慮在我繼續之前在運行時生成類的替代方法。最有可能更好,更容易維護替代產生類。
想到的一個問題是內存使用情況。如果每次收到請求時都動態構建一個類來處理某個請求,那麼您每次都有可能爲相同的值生成一個新類。一旦將類或程序集加載到應用程序域中,它就不能被卸載。因此,儘可能緩存生成的程序集和類。
除了這個問題?你可以保存你的代碼是在運行時使用Reflection創建的。這樣你就不必再創建它了? – 2010-04-17 20:01:03
是的,實際上您提供的鏈接已經保存了生成的代碼。 – 2010-04-17 20:05:00
哈哈。有趣的是它的代碼的最後一部分。顯示我有多注意。對於那個很抱歉。 – 2010-04-17 20:08:29