Por esses dias, precisei desenvolver um módulo onde a Model seria dinâmica. Como assim dinâmica? Não teria propriedades definidas? Sim, teria, mas apenas algumas… Outras, seriam variáveis dinâmicas, que teriam que se comportar de acordo com a necessidade do módulo… Só tinha um obstáculo na minha frente: eu não podia criar models diferentes para isso, colocando propriedades definidas, eu teria que criar uma só, pois a integração com o sistema do cliente só aceitava dessa maneira.

Pensei: “fácil, é só criar o objeto e definir suas propriedades em tempo de execução…”.

A pergunta era: “como fazer isso?”. Após algumas buscas pelo nosso amável Google, descobri que o C# possui uma classe chamada ExpandoObject, que fica na namespace System.Dynamic. Com ele, conseguimos criar um objeto em tempo de execução, e criarmos as propriedades que quisermos para ele. Realmente algo muito interessante…

Nesse artigo, iremos aprender um pouco sobre ele. Será apenas o ponta-pé inicial, mas caso aconteça algo parecido no trabalho de vocês, é só seguir o artigo que não tem erro.

Bom, chega de conversa e vamos ao artigo.

Vamos trabalhar com a model Pessoa, e vamos supor que por algum motivo precisamos criar um arquivo CSV onde no header do mesmo não podemos definir uma propriedade chamada “Genero”, e sim “Masculino” ou “Feminino”.

Para não criarmos duas models (HomemModel e MulherModel), criaremos uma model só, a PessoaModel.

Como trata-se de um objeto criado em tempo de execução, não precisamos criar uma model física para isso, ou seja, não precisamos criar a model PessoaModel.cs e definir suas propriedades, apenas damos um nome para o objeto e definimos suas propriedades.

O ExpandoObject() é uma classe do tipo dynamic.

Finalizando

Nesse artigo, utilizei uma aplicação do tipo ConsoleApplication, no entanto, o tipo dynamic é aplicável em qualquer tipo de aplicação C#, basta referenciar a namespace citada acima.

Abaixo, segue código e o resultado final.

dynamic pessoaModel = new System.Dynamic.ExpandoObject();

pessoaModel.Nome = "Thiago Vaini";
pessoaModel.Masculino = "M";

Console.WriteLine("Nome: {0}", pessoaModel.Nome);
Console.WriteLine("Sexo: {0}", pessoaModel.Masculino);

Console.ReadLine();

 

Resultado final - ExpandoObject()

Resultado final – ExpandoObject()

Conforme imagem acima, é assim que seu código irá funcionar. Repare que criamos o objeto em tempo de execução e definimos suas propriedades. Para resgatar seus valores, apenas passamos exatamente o nome da propriedade que o C# se encarrega de fazer isso sozinho. Mas atenção: o tipo dynamic diferencia maiúsculas e minúsculas, por isso é importante prestar atenção para não digitar a propriedade de maneiras diferentes.

Sei que o exemplo é bem besta, mas aonde quero chegar é que, caso aconteça de você estar na mesma situação que a minha, o ExpandoObject() salvará sua vida 😀

Se tiverem dúvidas, sugestões, ou algo que não deu certo, é só postar nos comentários abaixo que terei o prazer em ajudá-lo.

Espero ter sido útil e ajudado a quem estava em busca dessa dúvida.

Posted by Thiago Vaini