C# 4.0: Почему MethodBag, когда существует ExpandoObject?

ZX ASM 3.0

Это имело лучший пользовательский интерфейс и хороший набор функций по сравнению с другими ассемблерами в конце двадцатого века.

7
задан Jon Davis 30 November 2009 в 05:25
поделиться

2 ответа

Небольшое примечание: для тех, кто не знает, динамический пакет методов - это техника динамического добавления методов к объекту. Билл Вагнер описывает ее здесь с исходным кодом здесь.


Простой ответ заключается в том, что концепция MethodBag просто показывает вам технику. Вы можете абсолютно точно использовать ExpandoObject для этого, но может наступить момент, когда вы захотите написать свой собственный класс, который наследуется от System.Dynamic.DynamicObject. В качестве примера можно привести динамический объект JSON, YAML или XML, который позволяет ссылаться на данные в точечных свойствах-нотациях, а не традиционным строковым способом. Если вы наследуете от DynamicObject, вы можете обнаружить, что хотите разрешить добавление динамических функций в свой класс. Техника MethodBag показывает, как это сделать. ExpandoObject является лишь одним из примеров класса, реализующего эту технику. ExpandoObject будет хорош для 95% того, что вам нужно, а техника MethodBag покажет вам, как написать свой собственный, если вы решите сделать это для последних 5%.

5
ответ дан 6 December 2019 в 21:14
поделиться

MethodBags и аналогичные реализации имеют некоторые ограничения. Может быть проще реализовать собственный класс, если вы столкнетесь с этими препятствиями. В частности:

  • Трудно реализовать состояние в пакете методов. (Деревья выражений не могут содержать объекты, статически типизированные как динамический ; нет хорошего синтаксиса для создания методов, которые полагаются на внутреннее состояние одного и того же динамического объекта.)

  • Можно только добавлять общедоступные методы. Никаких виртуальных, частных, защищенных или абстрактных методов.

  • Невозможно реализовать интерфейс.

Для сравнения, ExpandoObjects являются настоящими классами и намного богаче и полнее. Они более точно имитируют то, что вы иначе получили бы бесплатно, скажем, в Ruby или Python.

7
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: