2010-08-22 14 views
43

Ich versuche, alle neuen Goodies zu lernen, die mit C# 4.0 kommen. Ich verstehe die Unterschiede zwischen den Typen DynamicObject und ExpandoObject nicht. Es scheint, als ob DynamicObject z.B. wenn Sie auf Variablen von Python-Skripten zugreifen möchten und ExpandoObject beim Sprechen mit COM/Office-Objekten. Habe ich recht? Was ist der Unterschied in ihrer Verwendung?C# 4.0 Dynamisch vs Expando ... wo passen sie?

+2

Bessere Antworten hier: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –

Antwort

86

Expando ist eindynamic Typ, zu dem Mitglieder zur Laufzeit hinzugefügt (oder entfernt) werden können. dynamic ist so konzipiert, dass .NET mit Typen interagieren kann, wenn es mit dynamischen Schreibsprachen wie Python und JavaScript interfiziert wird.

Also, wenn Sie einen dynamischen Typ behandeln müssen: Verwenden Sie dynamic und wenn Sie dynamische Daten verarbeiten müssen, wie XML oder JSON: verwenden ExpandoObject

Die Deklaration eines expando zeigt die Beziehung zwischen dem dynamischen und dem expando :

dynamic expando = new ExpandoObject(); 

Und die Fähigkeit, eine neue Eigenschaft hinzuzufügen:

expando.SomeNewStringVal = "Hello World!"; 

die letzte Codezeile ein brandneues String pro erstellt in dem Expando-Objekt SomeNewStringVal. Der String-Typ wird aus der Zuweisung abgeleitet.

Ein Expando ist also ein dynamischer Datentyp, der dynamisch sich ändernde Daten darstellen kann. Das ist es in aller Kürze. Here's a deeper look at dynamic and expando.

Komplettes Beispiel:

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

Obwohl er hat es, ich akzeptiert Ich denke, das OP bedeutete den Unterschied zwischen DynamicObject und ExpandoObject. – nawfal

+1

Nur um zu bemerken, dass dies in der realen Welt von Zeit zu Zeit praktisch ist. Ich habe es gerade aus API, um dyanische Antwort Objekte vor der Serialisierung zu XML oder JSON zu erstellen. Auf diese Weise kann ich rekursiv Unterklassen mit eindeutigen Eigenschaftsnamen hinzufügen, ohne eine Tonne expliziter Eigenschaften definieren zu müssen. "GroupsL1": [{"GroupingL2 :: [{... – user2326106

+0

[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- 4.7) wurde nicht adressiert MSDN: * Stellt eine Basisklasse für das Angeben des dynamischen Verhaltens zur Laufzeit bereit Diese Klasse muss geerbt werden, Sie können es nicht direkt instanziieren * Die MSDN-Seite enthält eine vereinfachte 'ExpandoObject'-Implementierung basierend auf' DynamicObject' Daher werden beide Typen mit der späten Bindung verwendet, aber "ExpandoObject" ist konkret (und versiegelt), während "DynamicObject" nur eine Basisklasse für benutzerdefinierte dynamische Objekte ist. – Palec