TOC

This article has been localized into Italian by the community.

Tipi di dati:

L'ExpandoObject

Come abbiamo visto in un articolo precedente, possiamo usare la parola chiave dynamic per contenere un oggetto, dove andremo a definire le proprietà, senza dover precedentemente definire la classe. Quello che non possiamo fare con un oggetto dynamic è aggiungergli dinamicamente proprietà dopo che questo è stato inizializzato. Se si ha bisogno di questa abilità specifica, C# ha una soluzione: l'ExpandoObject. Andiamo direttamente ad un esempio, così vediamo quanto è facile usarlo:

dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;
user.HomeTown = "New York";
Console.WriteLine(user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown);

Avrete notato che abbiamo dichiarato l'oggetto con il tipo dinamico, anche se abbiamo usato un ExpandoObject. La ragione è che, se l'oggetto fosse stato dichiarato come un ExpandoObject, il compilatore avrebbe verificato e immediatamente reclamato per la mancanza delle proprietà aggiunte da noi successivamente (Name, Age e così via). Possiamo impedirlo dichiarando la variabile come dynamic, che, come abbiamo imparato nel precedente articolo, impedisce al compilatore di verificare l'esistenza delle proprietà che useremo.

Una bella cosa è che un ExpandoObject può naturalmente avere proprietà che sono a loro volta ExpandoObject, permettendo di creare tipi complessi al volo, come in questo esempio:

dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;

user.HomeTown = new System.Dynamic.ExpandoObject();
user.HomeTown.Name = "New York";
user.HomeTown.ZipCode = 10001;

Console.WriteLine(user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown.Name + " [" + user.HomeTown.ZipCode + "]");

Cambiamo semplicemente la proprietà HomeTown da una stringa ad un ExpandoObject e poi a questo aggiungiamo delle proprietà, in questo caso il nome e il codice postale della città. Ma non finisce qui: possiamo anche aggiungere metodi all'oggetto, sempre al volo, usando alcuni trucchetti alquanto sofisticati:

user.DescribeUser = (Func<String>)(() => {
return user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown.Name + " [" + user.HomeTown.ZipCode + "]";
});

Console.WriteLine(user.DescribeUser());

Proprio bella roba, ma che cosa È veramente un ExpandoObject? Implementa diverse interfacce interessanti, ma una di queste è IDictionary<string, object>. Questo significa che al di là della sintassi addolcita, l'ExpandoObject è semplicemente un dizionario che contiene come valori, oggetti basati su chiavi stringa. Questo significa inoltre che iterare su un ExpandoObject è facile quanto iterare su un Dictionary normale. Questo è molto pratico:

dynamic user = new System.Dynamic.ExpandoObject();  
user.Name = "John Doe";  
user.Age = 42;  

foreach (KeyValuePair<string, object> kvp in user)
{
    Console.WriteLine(kvp.Key + ": " + kvp.Value);
}

Riepilogo

Il tipo ExpandoObject permette di definire oggetti al volo e poi aggiungerci proprietà quando vogliamo. Siccome è principalmente un tipo dynamic, eredita i suoi stessi vantaggi e svantaggi, come discusso nell'articolo precedente. Come bonus comunque, l'ExpandoObject implementa l'interfaccia INotifyPropertyChanged, cosa che si fa apprezzare se si usa WPF, per esempio, nell'applicazione.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!