2010-08-22 10 views
43

Estoy tratando de aprender todos los nuevos objetos que vienen con C# 4.0. No entiendo las diferencias entre los tipos DynamicObject y ExpandoObject. Parece que DynamicObject se usa, p. cuando desee acceder a las variables desde los scripts de Python y al ExpandoObject cuando hable con objetos COM/Office. ¿Estoy en lo cierto? ¿Cuál es la diferencia en su uso?C# 4.0 Dinámico vs Expando ... ¿dónde encajan?

+2

mejores respuestas aquí: http://stackoverflow.com/questions/3565481/differences-between-expandoobject-dynamicobject-and-dynamic –

Respuesta

86

Expando es un tipodynamic al que los miembros se pueden agregar (o eliminar) en tiempo de ejecución. dynamic está diseñado para permitir que .NET interactúe con los tipos al interactuar con lenguajes dinámicos de tipado como Python y JavaScript.

lo tanto, si usted necesita para manejar un tipo dinámico: utilizar dynamic y si usted necesita para manejar datos dinámicos tales como XML o JSON: utilizar ExpandoObject

La declaración de un expando muestra la relación entre la dinámica y la expando :

dynamic expando = new ExpandoObject(); 

Y la posibilidad de añadir una nueva propiedad:

expando.SomeNewStringVal = "Hello World!"; 

Esa última línea de código crea una nueva cadena de pro perty en el objeto expando llamado SomeNewStringVal. El tipo de cadena se deduce de la asignación.

Entonces, un expando es un tipo de datos dinámico que puede representar datos que cambian dinámicamente. Eso es todo en pocas palabras. Here's a deeper look at dynamic and expando.

Ejemplo 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

A pesar de que lo ha aceptado, yo Creo que el OP significaba diferencia entre DynamicObject y ExpandoObject. – nawfal

+1

Solo para tener en cuenta que esto es útil en el tiempo en el mundo real. Acabo de utilizarlo API para crear objetos de respuesta dyanmic antes de serializar a xml o json. De esta forma, puedo agregar recursivamente subclases con distintos nombres de propiedad sin tener que definir una tonelada de propiedades explícitas. "GroupsL1": [{"GroupingL2 :: [{... – user2326106

+0

[' DynamicObject'] (https://docs.microsoft.com/en-us/dotnet/api/system.dynamic.dynamicobject?view=netframework- 4.7) se dejó sin tratar. MSDN: * Proporciona una clase base para especificar el comportamiento dinámico en tiempo de ejecución. Esta clase debe heredarse; no se puede crear una instancia directamente. * La página MSDN contiene una implementación simplificada de 'ExpandoObject' basada en' DynamicObject' Por lo tanto, ambos tipos se usan con enlace tardío, pero 'ExpandoObject' es concreto (y sellado), mientras que' DynamicObject' es solo una clase base para objetos dinámicos personalizados. – Palec

Cuestiones relacionadas