2009-11-23 59 views

回答

5

快速注意:對於那些不知道的人來說,動態方法包是一種動態添加方法到對象的技術。比爾瓦格納描述它here與源代碼here


簡單的答案是,MethodBag概念只是顯示你的技術。你可以絕對使用ExpandoObject來做到這一點,但是你可能會有一段時間想編寫自己的類,它繼承自System.Dynamic.DynamicObject。一個例子可能是提供一個動態的JSON,YAML或XML對象,它允許你用點屬性標記而不是傳統的方式引用你的數據。如果你從DynamicObject繼承,你可能會發現你也想允許爲你的類添加動態函數。 MethodBag技術告訴你如何做到這一點。 ExpandoObject只是實現這種技術的一個例子。 ExpandoObject對於你所需要的95%是很好的,而MethodBag技術會告訴你如何在最後5%的時候自定義寫你自己的東西。

7

MethodBags和類似的實現往往有一些限制。如果發現自己遇到了這些障礙,實施自己的課程可能會更容易。具體如下:

  • 很難在方法包中實現狀態。 (表達式樹不能包含靜態類型爲dynamic的對象;沒有好的語法來創建依賴於同一動態對象上內部狀態的方法。)

  • 只能添加公共方法。沒有虛擬的,私人的,受保護的或抽象的方法。

  • 無法實現接口。

相比之下,ExpandoObjects是真正的類,並且更豐富,功能更齊全的。他們更接近地模仿你以其他方式免費獲得的東西,比如Ruby或Python。

+0

謝謝。但我認爲你扭轉了我的問題。我在問爲什麼在使用MethodBags的時候有ExpandoObject,而不是爲什麼當我使用MethodBags的時候使用ExpandoObject。 – 2009-11-23 04:56:10

+0

@ stimply77,方法被限制在一定的水平,正如約翰所說,你不能使用methodbgs你想要實現交互和更具體的類型.. – RameshVel 2009-11-23 05:40:32

+0

@ stimpy77:我認爲我的觀點更多,沒有太多的理由,除非除了少數幾種方法之外,你絕對不需要任何東西。 ExpandoObject似乎是更好的通用案例選擇。 – 2009-11-23 16:32:46