2010-08-22 9 views
43

Sto cercando di imparare tutti i nuovi extra forniti con C# 4.0. Non riesco a capire le differenze tra i tipi DynamicObject e ExpandoObject. Sembra che DynamicObject sia utilizzato per es. quando si desidera accedere alle variabili dagli script Python e ExpandoObject quando si parla con oggetti COM/Office. Ho ragione? Qual è la differenza nel loro uso?C# 4.0 Dinamico vs Expando ... dove si adattano?

+2

risposte meglio qui: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –

risposta

86

Expando è un tipodynamic a cui i membri possono essere aggiunti (o rimossi) in fase di esecuzione. dynamic è progettato per consentire a .NET di interagire con i tipi durante l'interfaccia con linguaggi di dattilografia dinamici come Python e JavaScript.

Quindi, se avete bisogno di gestire un tipo dinamico: utilizzare dynamic e se avete bisogno per gestire i dati dinamici come XML o JSON: utilizzare ExpandoObject

La dichiarazione di un expando mostra la relazione tra dinamica e l'expando :

dynamic expando = new ExpandoObject(); 

E la possibilità di aggiungere una nuova proprietà:

expando.SomeNewStringVal = "Hello World!"; 

l'ultima riga di codice crea una nuova stringa di pro perty nell'oggetto expando chiamato SomeNewStringVal. Il tipo di stringa viene dedotto dal compito.

Quindi un expando è un tipo di dati dinamico che può rappresentare dati che cambiano dinamicamente. Questo è tutto sommato. Here's a deeper look at dynamic and expando.

Esempio completo:

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

Anche se egli lo ha accolto, mi penso che l'OP significasse differenza tra DynamicObject e ExpandoObject. – nawfal

+1

Solo per notare questo è utile nel tempo nel mondo reale. Ho appena usato API per creare oggetti di risposta dyanmic prima di serializzarli su xml o json. In questo modo posso aggiungere ricorsivamente sottoclassi con nomi di proprietà distinti senza dover definire una tonnellata di proprietà esplicite. "GroupsL1": [{"GroupingL2 :: [{... – user2326106

+0

[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- MSDN: * Fornisce una classe base per specificare il comportamento dinamico in fase di esecuzione Questa classe deve essere ereditata da, non è possibile creare un'istanza direttamente. * La pagina MSDN contiene un'implementazione 'ExpandoObject' semplificata basata su' DynamicObject'. Quindi, entrambi i tipi vengono utilizzati con l'associazione tardiva, ma 'ExpandoObject' è concreto (e sigillato), mentre' DynamicObject' è solo una classe base per oggetti dinamici personalizzati. – Palec