2010-04-17 106 views
14

我一直很好奇在C#中運行時動態創建類,並偶然發現這篇文章。 http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html我很好奇聽到關於在運行時構造類的一些優點和缺點。在運行時創建C#類

有沒有意見?

+0

除了這個問題?你可以保存你的代碼是在運行時使用Reflection創建的。這樣你就不必再創建它了? – 2010-04-17 20:01:03

+0

是的,實際上您提供的鏈接已經保存了生成的代碼。 – 2010-04-17 20:05:00

+0

哈哈。有趣的是它的代碼的最後一部分。顯示我有多注意。對於那個很抱歉。 – 2010-04-17 20:08:29

回答

19

元編程具有構建時代碼的優點,但沒有額外的代碼步驟。這在庫代碼中非常常見,例如ORM,序列化程序,某些類型的AOP,DI/IoC容器等。

  • +避免了需要額外的構建步驟或寫平凡的代碼
  • +這樣的代碼可以處理哪些實際上在運行時的情況,而不必處理任何不常見的邊緣情況下,還是地段包裝的圍繞包裝(裝飾圖案)
  • +允許在場景代碼生成,其中所述元數據僅在運行時已知
  • +運行IL可以有私有字段等等,這要歸功於如何DynamicMethod可以與類型相關聯多個接入;完全生成(dll)代碼將需要[InternalsVisibleTo]或類似的,這可能是不可能的
  • - 並非所有系統支持運行時代碼生成;它在某些服務器設置,緊湊框架,iPhone等上被禁用。
  • - 它是bug醜陋要做。不管你怎麼做,這是而不是正常的代碼。
  • - 它需要的東西實際上是如何在幕後工作的一個很好的理解
  • +如果逼着你得到的東西實際上是如何在幕後工作的一個很好的理解

我目前重新 - 寫入現有庫以使用運行時IL生成;這是非常有益的,我很高興;但它不像什麼我以前寫過。

+0

謝謝大家的意見。 – 2010-04-19 01:04:51

0

您可能已經有運行時生成的類的經驗。泛型是在運行時在CLR中構建的,當他們第一次需要時。 XmlSerializer的實現也是如此。在運行時從頭建立類很可能非常難看(除非你喜歡看很多反射和代碼Dom代碼)。這是一個罕見的情況,這是最清晰和最簡單的解決方案。

0

優點:你可以在運行時創建任何需要的東西。

缺點:你沒有編譯時檢查,所以如果出現任何問題,一切都會爆炸。

基本上與使用反射的優點/缺點相同。

5

這不是正反兩方面的問題。

有時候,根據冗長的信息創建類是很方便的,這些信息以另一種方式轉換爲代碼,或者直到運行時纔可用。

鏈接文章中的示例不是(作爲應用程序員)通常會執行的操作。但它對於例如基於數據庫或XML模式生成類的工具很有用。

2

有一段時間和一切的地方,包括這個(例如,泛型)。不過,我會考慮在我繼續之前在運行時生成類的替代方法。最有可能更好,更容易維護替代產生類。

0

想到的一個問題是內存使用情況。如果每次收到請求時都動態構建一個類來處理某個請求,那麼您每次都有可能爲相同的值生成一個新類。一旦將類或程序集加載到應用程序域中,它就不能被卸載。因此,儘可能緩存生成的程序集和類。