No entiendo, ¿por qué utilizar Dynamic MethodBags cuando puedo usar ExpandoObject? ¿Que me estoy perdiendo aqui?C# 4.0: ¿Por qué MethodBag cuando hay ExpandoObject?
Respuesta
Nota rápida: para aquellos que no lo sepan, la bolsa de método dinámico es una técnica para agregar métodos dinámicamente a un objeto. Bill Wagner lo describe here con el código fuente here.
La respuesta simple es que el concepto MethodBag sólo le está mostrando una técnica. Puede usar absolutamente el ExpandoObject para hacer esto, pero puede haber un momento en que desee escribir su propia clase que hereda de System.Dynamic.DynamicObject
. Un ejemplo de esto podría ser proporcionar un objeto JSON, YAML o XML dinámico que le permita hacer referencia a sus datos en notación de propiedades de punto en lugar de en las formas tradicionales. Si heredas de DynamicObject, es posible que desees permitir la adición de funciones dinámicas a tu clase también. La técnica MethodBag te muestra cómo hacerlo. El ExpandoObject es solo un ejemplo de una clase que implementa esta técnica. ExpandoObject será bueno para el 95% de lo que necesita, y la técnica MethodBag le muestra cómo personalizar su propia escritura cuando decide hacerlo durante el último 5%.
MethodBag y las implementaciones análogas tienden a tener algunas limitaciones. Puede ser más fácil simplemente implementar su propia clase si se encuentra con estas barricadas. Específicamente:
Imposible implementar el estado en una bolsa de método. (Los árboles de expresiones no pueden contener objetos que están tipados estáticamente como
dynamic
; no hay una buena sintaxis para crear métodos que dependan del estado interno del mismo objeto dinámico).Solo se pueden agregar métodos públicos. No hay métodos virtuales, privados, protegidos o abstractos.
No se puede implementar una interfaz.
En comparación, ExpandoObjects
son verdaderas clases y son mucho más rica y con todas las funciones. Más exactamente imitan lo que de otra manera obtendrías gratis en, digamos, Ruby o Python.
- 1. ¿ExpandoObject de C# 4.0 admite la herencia basada en prototipos?
- 2. C# 4.0 Dinámico vs Expando ... ¿dónde encajan?
- 3. ¿Por qué ExpandoObject no funciona como se esperaba?
- 4. ¿Por qué no hay varianza genérica para las clases en C# 4.0?
- 5. Diseño por contrato/C# 4.0/evitando ArgumentNullException
- 6. ¿Por qué existen ZeroMemory, etc. cuando ya hay memset, etc.?
- 7. ¿Por qué no hay pool de autorelease cuando realizo SelectorInBackground :?
- 8. ¿Por qué hay una eliminación [] en C++?
- 9. ¿Por qué no hay ReverseEnumerator en C#?
- 10. ¿Por qué hay cuatro compiladores mono C#?
- 11. ¿Por qué mis proyectos se crean cuando no hay cambios?
- 12. Serializando ExpandoObject con ServiceStack.Text
- 13. ¿Por qué C++ es compatible con C? ¿Por qué no hay algún lenguaje C++ "puro"?
- 14. ¿Por qué usar matrices en VBA cuando hay colecciones?
- 15. ¿Por qué usar werkzeug cuando hay un matraz
- 16. ¿Por qué no hay operador || = en C/C++?
- 17. Reflexionar sobre un ExpandoObject
- 18. ¿Por qué hay CL_DEVICE_MAX_WORK_GROUP_SIZE?
- 19. Genérico Varianza en C# 4.0
- 20. ¿Por qué no hay algo así como IMonad <T> en la próxima .NET 4.0
- 21. ¿Por qué hay Synchsafe Integer?
- 22. ¿Por qué no hay "referencia NULL" en C++?
- 23. ¿Por qué C++ genera números negativos cuando usa módulo?
- 24. ¿Qué hace cin cuando hay un error
- 25. ¿Por qué .net 4.0 escribe todo esto en DebugView?
- 26. ¿Cómo hago webMethods serializar ExpandoObject
- 27. ¿Por qué hay imageCreateFrom * si hay imageCreateFromString?
- 28. ¿Por qué no hay Dictionary.TrimExcess()?
- 29. versión abreviada de ExpandoObject o un diccionario?
- 30. Mixins con C# 4.0
Gracias. Pero creo que revertiste mi pregunta. Me preguntaba por qué usar MethodBags cuando hay ExpandoObject, no por qué usar ExpandoObject cuando puedo usar MethodBags. –
@ stimply77, los paquetes de métodos están limitados a cierto nivel, ya que John dijo que no puedes usar methodbgs donde quisieras implementar intefaces y tipos más específicos. – RameshVel
@ stimpy77: Creo que mi punto era más que no hay mucha razón para, a menos absolutamente no necesitas nada, excepto algunos métodos. ExpandoObject parece ser la mejor opción de caso general. –