C# 4.0 Dynamic vs Expando... where do they fit?

c#-4.0, dynamic-keyword, dynamicobject, expandoobject

Solution

Expando is a `dynamic` type to which members can be added (or removed) at runtime. `dynamic` is designed to allow .NET to interoperate with types when interfacing with dynamic typing languages such as Python and JavaScript.

So, if you need to handle a dynamic type: use `dynamic` and if you need to handle dynamic data such as XML or JSON: use ExpandoObject

The declaration of an expando shows the relationship between dynamic and the expando:

dynamic expando = new ExpandoObject();

And the ability to add a new property:

expando.SomeNewStringVal = "Hello World!";

That last line of code creates a brand new string property in the expando object called `SomeNewStringVal`. The string type is inferred from the assignment.

So an expando is a dynamic data type that can represent dynamically changing data. That's it in a nutshell. Here's a deeper look at dynamic and expando.

Complete example:

using System;
using System.Dynamic;

class Program
{
    static void Main(string[] args)
    {
        dynamic expando = new ExpandoObject();
        expando.SomeNewStringVal = "Hello Brave New Whirrled!";
        Console.WriteLine(expando.SomeNewStringVal);

        // more expando coolness/weirdness:
        var p = expando as IDictionary<String, object>;
        p["A"] = "New val 1";
        p["B"] = "New val 2";

        Console.WriteLine(expando.A);
        Console.WriteLine(expando.B);
    }
}

Problem

I am trying to learn all the new goodies that come with C# 4.0. I am failing to understand the differences between the `DynamicObject` and `ExpandoObject` types. It seems like `DynamicObject` is used e.g. when you want to access variables from Python scripts and `ExpandoObject` when talking with COM/Office objects. Am I right? What is the difference in their use?

Original source

Related problems