Sei que faz tempo que não posto então aqui vai um post rápido, mas com conteúdo (espero que vocês vejam dessa forma também). Finalmente comecei a trabalhar efetivamente com C# 4 e por coincidência (ou não) já precisei de dynamic objects pra resolver um problema.
Meu sistema recebe como entrada alguns arquivos XML para serem processados e transformados em outros objetos posteriormente. XML é um saco e é definitivamente uma das coisas que eu mais odeio em desenvolvimento de software. Tudo com XML é trabalhoso. Sendo assim criei uma pequena Lib que transforma XML em objetos dinamicos pra eliminar a necessidade de lidar com nós e atributos diretamentes e também permitir futuras implementacões.
Com XmlToObjectParser é possível:
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd country="USA">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<price>10.90</price>
</cd>
<cd country="UK">
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<price>10.0</price>
</cd>
<cd country="USA">
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<price>9.90</price>
</cd>
</catalog>
var numberOfCDsinCatalog = catalog.catalog.cd.Count; //Retorna 3 var titleFromUKCD = catalog.catalog.cd[1].title; // Retorna "Hide your heart"
Bem mais legível e prático de usar, na minha opinião.
O projeto e a DLL compilada estão no GitHub assim como a documentacão e informacões adicionais.
Enjoy!
Oi amigo,
desculpa, mas não entendi a parte do dynamic. Pelo seu código não tem nada usando dynamic, certo?
abraços
Opa @Casion,
ele é todo baseado em Dynamic. Sem Dynamic seria impossível implementar essa biblioteca. Dynamic basicamente impede que o compilador faca a checagem do seu tipo no momento da compilacão. ExpandoObject implementa a interface (IDynamicMetaObjectProvider) que permite tipos Dynamic.
Você deve estar falando isso, pois está vendo o IDictionary ai, certo?
ExpandoObject implementa IDictionary pra permitir a adicão dinamica de propriedades em runtime. Quando eu chamo o método Add a implementacão de ExpandoObject adiciona a chave que eu passo, dinamicamente (provavelmente com reflection – estou vendo a implementacao agora no Reflector pra entender) como uma propriedade no objeto em questão e como ele é Dynamic o compilador pula a checagem de tipos na hora de compilar permitindo que a propriedade seja lida dinamicamente em tempo de execucão.
Se voce quiser saber mais recomendo a seguinte leitura:
http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx
http://msdn.microsoft.com/en-us/library/dd264736.aspx
Ah entendi, obrigado pelo esclarecimento!
mas então eu não teria Intellisense no código para consumir essa estrutura de XML, correto?
afinal, a IDE desconhece a estrutura do xml.
Essa funcionalidade do Dynamic eu até conheço, pois ela é baseada na estrutura do Microsoft Visual Fox Pro 9, linguagem RAD da Microsoft que foi descontinuada no ano passado.
abraços!
Você esta certo. O intelisense vai pro balalau não só pra esse objeto mas pra qualquer dynamic.