Eai filhotes, tudo bem? Primeiro gostaria de agradecer os feedbacks positivos que vocês me deram, obrigado =D.

Mas então, continuando com o assunto dynamic (se você não viu o último post clique aqui) hoje falaremos sobre o ExpandoObject.

Um objeto que pode ser expandido

Bom, o ExpandoObject é bem simples de ser entendido, ele é apenas uma classe que permite que seus objetos tenham membros adicionadas ou removidas dinamicamente. Ou seja, é um objeto que se expande em tempo de execução. Um baiacu da programação.

Mas como assim “membros”? Bom, segue um exemplo:

// Instancia um novo ExpandoObject
dynamic usuario = new ExpandoObject();
// Não existe uma propriedade "Nome" mas não irá gerar erro pois ela sera criada
// automaticamente em tempo de execução
usuario.Nome = "André Castro";
// Ira imprimir "André Castro"
Console.WriteLine(usuario.Nome)

O código acima irá rodar sem problemas ja que a propriedade “Nome” será criada em tempo de execução. É como se fosse um Hashtable ou mesmo um  Dictionary (ja que o ExpandoObject herda de IDictionary<string,object>) você invoca o nome da propriedade passa o valor e se ela existir, atualiza, senão, cria.
Com isso conseguimos adicionar quantas propriedades quisermos.

Acessando todas as propriedades

-“E como eu faço para saber quais as propriedades desse objeto, já que elas são criadas dinamicamente?”

Bom, isso é mais fácil que ganhar do Cruzeiro! Lembra que o ExpandoObject herda de IDictionary? Pois é:

// Criamos um objeto dinâmico e o preenchemos

            dynamic meuExpando = new ExpandoObject();

            meuExpando.Nome = "André";
            meuExpando.Idade = 23;
            meuExpando.DataNascimento = new DateTime(1988, 06, 16);          

            // Podemos pegar todas as propriedades do nosso ExpandoObject
            var prop = meuExpando as IDictionary<string,object>;

            // Laço para imprimir todas as propriedades
            foreach (var item in prop)
            {
                // Imprime a propriedades do objeto
                Console.WriteLine(item.Key);
            }

            Console.ReadLine();

Com isso você pode ver quais propriedades e até adicionar/remover propriedades como faria em qualquer outro objeto do tipo Dictionary! Facilitando ainda mais o uso do ExpandoObject em tempo de execução!

Mas espere um minuto, e se eu herdar uma classe minha do ExpandoObject?

Bom, na verdade a ExpandoObject é uma classe sealed e não pode ser herdada. Mas fique tranquilo com relação a isso por enquanto. Em pouco tempo aprenderemos a dominar os elementos necessários para criar uma classe dessa.

“Só isso? bom, realmente é uma classe legalzinha…”

Paciência, gafanhoto.

Eventos neles!

O ExpandoObject ainda tem mais uma habilidade interessante. Você também consegue atribuir eventos para ele. Vamos ao exemplo!
Temos uma pagina com apenas um botão (btnTeste) e então no code behind faremos:

 // Propriedade que sera nossa mensagem
        public string MessageTest { get; set; }

        protected void Page_Load(object sender, EventArgs e)
        {
                // Crio meu objeto
                dynamic obj = new ExpandoObject();
                // Inicializo a propriedade
                obj.MegaEvento = null;
                // Adiciono os handlers
                obj.MegaEvento += new EventHandler(evento1);
                obj.MegaEvento += new EventHandler(evento2);

                // Adiciono meus eventos ao click do botão
                btnTeste.Click += obj.MegaEvento;
        }

        protected void evento1(object sender, EventArgs e)
        {
            // Preenche a mensagem
            MessageTest = "Teste de Evento";

        }

        protected void evento2(object sender, EventArgs e)
        {
            //Chama um alerta para mandar a mensagem
            ClientScript.RegisterClientScriptBlock(this.GetType(), "alerta", "alert('" + MessageTest + "');", true);

        }

O resultado:

Pois é… Suporte a eventos… Bacana né?

– “Então alem de propriedades conseguimos adicionar eventos também? Ta, esse negocio realmente é legal.”

Sim filho, mas infelizmente isso é tudo que o ExpandoObject  tem a oferecer…

Métodos

Também é possivel adicionar métodos no ExpandoObject com a mesma praticidade dos anteriores:

// Crio meu objeto
            dynamic t800 = new ExpandoObject();

            // Crio uma função que recebe uma string e retorna uma string
            t800.Saudacao = new Func<string, string>((par) => {
                return string.Format("Bom dia {0} eu sou o T800.",par);
            });          

            // Invoco meu metodo e o imprimo na tela
            Console.WriteLine(
                t800.Saudacao("Andre")
                );

Conclusão

Há muitas coisas legais e uteis que podem ser feitas com o ExpandoObject. Sua “habilidade” permite adicionar propriedades, métodos e eventos em tempo de execução, deixando sua aplicação muito mais dinâmica e abrindo outros vários caminhos.

Lembrando que isso foi apenas uma demonstração básica do ExpandoObject, não o subestime pois ainda podemos fazer mais coisas legais com ele.

Ate a próxima!

Referências:

http://stackoverflow.com/questions/2974008/adding-unknown-at-design-time-properties-to-an-expandoobject

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

http://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject

http://blogs.msdn.com/b/csharpfaq/archive/2009/10/01/dynamic-in-c-4-0-introducing-the-expandoobject.aspx