Depuis que j'ai écrit l'article MSDN vous faites allusion, je suppose que je dois répondre à ça.
Tout d'abord, je m'attendais à cette question et c'est pourquoi j'ai écrit un post de blog qui montre de manière plus ou moins réel de cas d'utilisation pour ExpandoObject: Dynamique en C# 4.0: présentation de l'ExpandoObject.
Peu de temps, ExpandoObject peut vous aider à créer des objets hiérarchiques. Par exemple, imaginez que vous avez un dictionnaire dans un dictionnaire:
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"]);
Plus profonde est la hiérarchie, le plus laid, c'est le code. Avec ExpandoObject il reste élégant et lisible.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
Deuxièmement, comme il a déjà été souligné, ExpandoObject implémente l'interface INotifyPropertyChanged qui vous donne plus de contrôle sur les propriétés qu'un dictionnaire.
Enfin, vous pouvez ajouter des événements à ExpandoObject comme ici:
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;
if (e != null)
{
e(d, new EventArgs());
}
// We could also fire it with...
// d.MyEvent(d, new EventArgs());
// ...if we knew for sure that the event is non-null.
}
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);
}
}