Desde que escrevi o artigo do MSDN a que você está se referindo, acho que tenho que responder a este.
Primeiro, eu antecipei essa pergunta e foi por isso que escrevi uma postagem no blog que mostra um caso de uso mais ou menos real para o ExpandoObject: Dynamic no C # 4.0: Apresentando o ExpandoObject .
Em breve, o ExpandoObject pode ajudá-lo a criar objetos hierárquicos complexos. Por exemplo, imagine que você tenha um dicionário dentro de um dicionário:
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"]);
Quanto mais profunda é a hierarquia, mais feio é o código. Com o ExpandoObject, ele permanece elegante e legível.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
Segundo, como já foi apontado, o ExpandoObject implementa a interface INotifyPropertyChanged, que oferece mais controle sobre propriedades do que um dicionário.
Por fim, você pode adicionar eventos ao ExpandoObject como aqui:
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);
}
}
Além disso, lembre-se de que nada o impede de aceitar argumentos de eventos de maneira dinâmica. Em outras palavras, em vez de usar EventHandler
, você pode usar o EventHandler<dynamic>
que causaria o segundo argumento do manipulador dynamic
.