web-dev-qa-db-fra.com

C # 4.0 Dynamic vs Expando ... où se situent-ils?

J'essaie d'apprendre tous les nouveaux goodies qui viennent avec C # 4.0. Je n'arrive pas à comprendre les différences entre les types DynamicObject et ExpandoObject. Il semble que DynamicObject soit utilisé par exemple lorsque vous souhaitez accéder à des variables à partir de Python et ExpandoObject lorsque vous parlez avec des objets COM/Office. Ai-je raison? Quelle est la différence dans leur utilisation?

49
Perpetualcoder

Expando est undynamic type auquel les membres peuvent être ajoutés (ou supprimés) au moment de l'exécution. dynamic est conçu pour permettre à .NET d'interagir avec des types lors de l'interfaçage avec des langages de frappe dynamiques tels que Python et JavaScript.

Donc, si vous devez gérer un type dynamique: utilisez dynamic et si vous devez gérer des données dynamiques telles que XML ou JSON: utilisez ExpandoObject

La déclaration d'un expando montre la relation entre dynamique et expando:

dynamic expando = new ExpandoObject();

Et la possibilité d'ajouter une nouvelle propriété:

expando.SomeNewStringVal = "Hello World!";

Cette dernière ligne de code crée une toute nouvelle propriété de chaîne dans l'objet expando appelée SomeNewStringVal. Le type de chaîne est déduit de l'affectation.

Un expando est donc un type de données dynamique qui peut représenter des données à changement dynamique. C'est tout en un mot. Voici un regard plus profond sur dynamique et expando .

Exemple complet:

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);
    }
}
89
Paul Sasik