This article has been localized into Portuguese by the community.
O tipo ExpandoObject
Como vimos em um artigo anterior, podemos usar a palavra-chave dynamic para manter um objeto onde definimos as propriedades, sem ter que definir a classe primeiro. O que nós não podemos fazer com um objeto dinâmico é adicionar dinamicamente propriedades a ele depois que o objeto foi inicializado. Se você precisar dessa habilidade específica, o C # vem com uma solução para você: O ExpandoObject . Vamos pular direto para um exemplo, assim você pode ver como é fácil de usar:
dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;
user.HomeTown = "New York";
Console.WriteLine(user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown);
Você notará que eu declaro o objeto com o tipo dinâmico, mesmo que eu instancie um ExpandoObject. A razão é que, se o objeto fosse declarado como um ExpandoObject, o compilador o verificaria e imediatamente reclamaria da falta das propriedades que inventamos para ele (Name, Age e assim por diante). Podemos evitar isso declarando-o como dinâmico, o que, como aprendemos no artigo anterior, impedirá que o compilador verifique a existência das propriedades que usamos.
Uma coisa legal é que um ExpandoObject pode ter propriedades que também são do ExpandoObject, permitindo que você crie tipos complexos em tempo real, como neste exemplo:
dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;
user.HomeTown = new System.Dynamic.ExpandoObject();
user.HomeTown.Name = "New York";
user.HomeTown.ZipCode = 10001;
Console.WriteLine(user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown.Name + " [" + user.HomeTown.ZipCode + "]");
Eu simplesmente altero a propriedade HomeTown de uma string para um ExpandoObject e, em seguida, adiciono propriedades a ela, nesse caso, o nome e o código postal da cidade. Mas isso não tem que acabar com isso - podemos até adicionar métodos ao objeto, novamente de forma rápida, usando alguns truques bastante sofisticados:
user.DescribeUser = (Func<String>)(() => {
return user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown.Name + " [" + user.HomeTown.ZipCode + "]";
});
Console.WriteLine(user.DescribeUser());
Coisas bem legais, mas o que é realmente um ExpandoObject? Ele implementa várias interfaces interessantes, mas uma delas é IDictionary & lt; string, object & gt; - isto significa que abaixo de todo o açúcar sintático, seu ExpandoObject é basicamente apenas um dicionário que contém valores de objetos baseados em chaves de string. Isso também significa que iterar em um ExpandoObject é tão fácil quanto iterar por meio de um dicionário comum. Isso é muito prático:
dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;
foreach (KeyValuePair<string, object> kvp in user)
{
Console.WriteLine(kvp.Key + ": " + kvp.Value);
}
Resumo
O tipo ExpandoObject permite que você defina objetos rapidamente e, em seguida, adicione propriedades a ele sempre que desejar. Como é basicamente um tipo dinâmico, ele herda as mesmas vantagens e desvantagens discutidas no artigo anterior. Como bônus, o ExpandoObject implementa a interface INotifyPropertyChanged, que você definitivamente apreciará se estiver usando, por exemplo, WPF para sua aplicação.