Каковы различия между System.Dynamic.ExpandoObject
, System.Dynamic.DynamicObject
и dynamic
?
В каких ситуациях вы используете эти типы?
Ключевое слово dynamic
используется для объявления переменных, которые должны быть привязаны позднее.
Если вы хотите использовать позднее связывание для любого реального или воображаемого типа, вы используете ключевое слово dynamic
, а компилятор сделает все остальное.
Когда вы используете ключевое слово dynamic
для взаимодействия с обычным экземпляром, DLR выполняет вызовы с поздней привязкой к обычным методам экземпляра.
Интерфейс IDynamicMetaObjectProvider
позволяет классу управлять поведением позднего связывания.
Когда вы используете ключевое слово dynamic
для взаимодействия с реализацией IDynamicMetaObjectProvider
, DLR вызывает методы IDynamicMetaObjectProvider
, и объект сам решает, что делать.
Классы ExpandoObject
и DynamicObject
являются реализациями IDynamicMetaObjectProvider
.
ExpandoObject
— это простой класс, который позволяет вам добавлять элементы в экземпляр и использовать их динамически
вместе.
DynamicObject
— это более продвинутая реализация, которую можно наследовать, чтобы легко обеспечить индивидуальное поведение.
Согласно спецификации языка C# dynamic
является объявлением типа. т.е. dynamic x
означает, что переменная x
имеет тип dynamic
.
DynamicObject
— это тип, который упрощает реализацию IDynamicMetaObjectProvider
и, таким образом, переопределяет конкретное поведение привязки для этого типа.
ExpandoObject
— это тип, который действует как набор свойств. т.е. вы можете добавлять свойства, методы и т. д. к динамическим экземплярам этого типа во время выполнения.