Differences between ExpandoObject, DynamicObject and dynamic

.net, c#, dynamic, dynamicobject, expandoobject

Solution

The `dynamic` keyword is used to declare variables that should be late-bound. If you want to use late binding, for any real or imagined type, you use the `dynamic` keyword and the compiler does the rest.

When you use the `dynamic` keyword to interact with a normal instance, the DLR performs late-bound calls to the instance's normal methods.

The `IDynamicMetaObjectProvider` interface allows a class to take control of its late-bound behavior. When you use the `dynamic` keyword to interact with an `IDynamicMetaObjectProvider` implementation, the DLR calls the `IDynamicMetaObjectProvider` methods and the object itself decides what to do.

The `ExpandoObject` and `DynamicObject` classes are implementations of `IDynamicMetaObjectProvider`.

`ExpandoObject` is a simple class which allows you to add members to an instance and use them `dynamic`ally. `DynamicObject` is a more advanced implementation which can be inherited to easily provide customized behavior.

Problem

What are the differences between `System.Dynamic.ExpandoObject`, `System.Dynamic.DynamicObject` and `dynamic`? In which situations do you use these types?

Original source