2010-08-22 7 views
43

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 est utilisé par ex. lorsque vous souhaitez accéder aux variables à partir de scripts Python et ExpandoObject lorsque vous parlez avec des objets COM/Office. Ai-je raison? Quelle est la différence dans leur utilisation?C# 4.0 Dynamique vs Expando ... où vont-ils?

+2

réponses mieux ici: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –

Répondre

86

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

Donc, si vous avez besoin pour gérer un type dynamique: utilisez dynamic et si vous avez besoin pour gérer les données dynamiques comme XML ou JSON: utiliser ExpandoObject

La déclaration d'une expando montre la relation entre dynamique et la 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 chaîne pro perty dans l'objet expando appelé SomeNewStringVal. Le type de chaîne est déduit de l'affectation. Donc, un expando est un type de données dynamique qui peut représenter des données changeant dynamiquement. Voilà en un mot. Here's a deeper look at dynamic and 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); 
    } 
} 
+5

Bien qu'il ait accepté, je pense que l'OP signifie différence entre DynamicObject et ExpandoObject. – nawfal

+1

Juste pour noter que cela est utile dans le monde réel. Je viens de l'utiliser pour créer des objets de réponse dyanmic avant de sérialiser xml ou json. De cette façon, je peux récursivement ajouter des sous-classes avec des noms de propriétés distincts sans avoir à définir une tonne de propriétés explicites. "GroupsL1": [{"GroupingL2 :: [{... – user2326106

+0

[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- MSDN: * Fournit une classe de base pour spécifier le comportement dynamique au moment de l'exécution.Cette classe doit être héritée de, vous ne pouvez pas l'instancier directement. * La page MSDN contient une implémentation 'ExpandoObject' simplifiée basée sur' DynamicObject' Donc, les deux types sont utilisés avec une liaison tardive, mais 'ExpandoObject' est concret (et scellé), alors que' DynamicObject' est juste une classe de base pour les objets dynamiques personnalisés. – Palec