Da quando ho scritto l'articolo di MSDN a cui ti riferisci, suppongo di dover rispondere a questo.
Innanzitutto, ho anticipato questa domanda ed è per questo che ho scritto un post sul blog che mostra un caso d'uso più o meno reale per ExpandoObject: Dynamic in C # 4.0: Presentazione di ExpandoObject .
In breve, ExpandoObject può aiutarti a creare oggetti gerarchici complessi. Ad esempio, immagina di avere un dizionario all'interno di un dizionario:
Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);
Più profonda è la gerarchia, più brutto è il codice. Con ExpandoObject rimane elegante e leggibile.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
In secondo luogo, come è già stato sottolineato, ExpandoObject implementa l'interfaccia INotifyPropertyChanged che offre un maggiore controllo sulle proprietà rispetto a un dizionario.
Infine, puoi aggiungere eventi a ExpandoObject come qui:
class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
// Initialize the event to null (meaning no handlers)
d.MyEvent = null;
// Add some handlers
d.MyEvent += new EventHandler(OnMyEvent);
d.MyEvent += new EventHandler(OnMyEvent2);
// Fire the event
EventHandler e = d.MyEvent;
e?.Invoke(d, new EventArgs());
}
static void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent fired by: {0}", sender);
}
static void OnMyEvent2(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
}
}
Inoltre, tieni presente che nulla ti impedisce di accettare argomenti di eventi in modo dinamico. In altre parole, invece di utilizzare EventHandler
, è possibile utilizzare EventHandler<dynamic>
ciò che provocherebbe il secondo argomento del gestore dynamic
.