Мое понимание , которое может быть ограничено (я не эксперт DLR) в том, что в случае использования выражения дерево выражений обходится для таких узлов, как MemberExpression
, и имена каждого члена / метода / и т. д. используются для связи с поставщиком каждого объекта. Это вероятно означает использование интерфейса IDynamicMetaObjectProvider
, передавая выражение. Выражение выражения для ключевых узлов очень похоже на технологии, такие как поставщики LINQ, за исключением того, что во многих отношениях проще (поскольку существует более прямое сопоставление - его не нужно перефразировать на иностранном языке, таком как SQL).
Реализация динамического объекта определяется этим динамическим объектом , но может тогда означать поиск значений из внутреннего словаря значений (например, ExpandoObject
), или может быть что угодно (например, некоторый специальный подкласс DynamicObject
или реализация from-first-принципалы IDynamicMetaObjectProvider
).
В случае, если тип не реализует IDynamicMetaObjectProvider
(т. Е. Не динамический объект, плавающий в динамическом мире), то обычно отражение используется как запасной вариант, кэшируя механизм для этого (возможно, поскольку отражение не является динамическим и не может быть исправлено обезьянами и т. д.).