This article has been localized into Italian by the community.
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.