我不明白,爲什麼在我可以使用ExpandoObject時使用動態MethodBags?我在這裏錯過了什麼?C#4.0:爲什麼MethodBag存在ExpandoObject?
7
A
回答
5
快速注意:對於那些不知道的人來說,動態方法包是一種動態添加方法到對象的技術。比爾瓦格納描述它here與源代碼here。
簡單的答案是,MethodBag概念只是顯示你的技術。你可以絕對使用ExpandoObject來做到這一點,但是你可能會有一段時間想編寫自己的類,它繼承自System.Dynamic.DynamicObject
。一個例子可能是提供一個動態的JSON,YAML或XML對象,它允許你用點屬性標記而不是傳統的方式引用你的數據。如果你從DynamicObject繼承,你可能會發現你也想允許爲你的類添加動態函數。 MethodBag技術告訴你如何做到這一點。 ExpandoObject只是實現這種技術的一個例子。 ExpandoObject對於你所需要的95%是很好的,而MethodBag技術會告訴你如何在最後5%的時候自定義寫你自己的東西。
7
MethodBags和類似的實現往往有一些限制。如果發現自己遇到了這些障礙,實施自己的課程可能會更容易。具體如下:
很難在方法包中實現狀態。 (表達式樹不能包含靜態類型爲
dynamic
的對象;沒有好的語法來創建依賴於同一動態對象上內部狀態的方法。)只能添加公共方法。沒有虛擬的,私人的,受保護的或抽象的方法。
無法實現接口。
相比之下,ExpandoObjects
是真正的類,並且更豐富,功能更齊全的。他們更接近地模仿你以其他方式免費獲得的東西,比如Ruby或Python。
相關問題
- 1. ExpandoObject - 爲什麼Type的行爲不同?
- 2. 是什麼在C#4.0
- 3. C# - ExpandoObject定義
- 4. ExpandoObject C#IL
- 5. ExpandoObject的真正優點是什麼?
- 6. 爲什麼IEquatable T不會在T中針對C#4.0逆轉?
- 7. 爲什麼匿名類型不像ExpandoObject那樣動態?
- 8. 爲什麼ExpandoObject不能按預期工作?
- 9. 爲什麼在C++
- 10. 爲什麼在C#
- 11. C GNU-isms存在什麼?
- 12. C#動態ExpandoObject陣列
- 13. 爲什麼這個自定義字典類不工作 - C#4.0
- 14. 爲什麼沒有這個C#4.0異步方法被調用?
- 15. ExpandoObject在Nemerle
- 16. 爲什麼SqlTrackingService不能用於WF 4.0?
- 17. 爲什麼.NET 2.0快4.0然後
- 18. 爲什麼是Rails的4.1和4.0
- 19. 爲什麼會有內存泄漏? (C)
- 20. c-extension Python內存泄漏,爲什麼?
- 21. c pthreads + valgrind =內存泄漏:爲什麼?
- 22. 爲什麼System.Numerics.BigInteger在Silverlight 4.0中沒有Parse方法,但在.Net 4.0中有?
- 23. 爲什麼int存在於C中,爲什麼不只是短和長
- 24. Mono爲什麼存在?
- 25. 爲什麼Console.Out.WriteLine存在?
- 26. 爲什麼存在java.util.Scanner?
- 27. 爲什麼Microsoft.Office.Interop.Outlook.Excecption存在?
- 28. 爲什麼respondsToSelector:存在?
- 29. 爲什麼java.net.SocketInputStream不存在?
- 30. 爲什麼`display:table`存在?
謝謝。但我認爲你扭轉了我的問題。我在問爲什麼在使用MethodBags的時候有ExpandoObject,而不是爲什麼當我使用MethodBags的時候使用ExpandoObject。 – 2009-11-23 04:56:10
@ stimply77,方法被限制在一定的水平,正如約翰所說,你不能使用methodbgs你想要實現交互和更具體的類型.. – RameshVel 2009-11-23 05:40:32
@ stimpy77:我認爲我的觀點更多,沒有太多的理由,除非除了少數幾種方法之外,你絕對不需要任何東西。 ExpandoObject似乎是更好的通用案例選擇。 – 2009-11-23 16:32:46