2009-11-23 15 views

Respuesta

5

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%.

7

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.

+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. –

+0

@ 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

+0

@ 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. –

Cuestiones relacionadas