This article has been localized into Dutch by the community.
Het ExpandoObject
In het vorige artikel werd het dynamic sleutelwoord besproken dat een object kan bevatten en waarvan we de eigenchappen konden benaderen zonder eerst de klasse te definiëren. We kunnen echter niet dynamisch eigenschappen toevoegen nadat een object is geïnitialiseerd. Als dit nodig is heeft C# het ExpandoObject. Een voorbeeld maakt het duidelijk:
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);
Hier wordt een object gedeclareerd van het dynamic type ondanks dat een ExpandoObject geïnstantieerd wordt. De reden is duidelijk: als het object zou gedeclareerd worden als een ExpandoObject zou de compiler het controleren en onmiddellijk een fout melden omtrent de eigenschappen die worden geïntroduceerd (Name, Age en zo verder). Dit wordt voorkomen door het object als dynamic te declareren zodat de compiler geen controle uitvoert over het bestaan van die eigenschappen.
Een ExpandoObject kan ook andere ExpandoObjecten als eigenschap hebben zodat dynamisch complexe objecten kunnen gemaakt worden, zoals in volgend voorbeeld:
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 + "]");
De HomeTown eigenschap wordt gewijzigd van een string in een ExpandoObject en dan worden er eigenschappen toegevoegd, in dit geval de naam van de stad en de postcode (zipCode). Maar dat is niet alles: met enkele trucs kunnen zelfs methoden worden toegevoegd aan het object:
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());
Wat is een ExpandoObject eigenlijk? Het ExpandoObject heeft diverse interfaces. Een ervan is IDictionary<string, object>. Dit betekent dat onder de motorkap ExpandoObject in principe een gewone Dictionary is die waarden van objecten bevat gebaseerd op strings. Een ExpandoObject doorlopen is dan ook hetzelfde als een gewone Dictionary doorlopen. Dit is zeer praktisch:
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);
}
Samenvatting
Het ExpandoObject laat toe dynamisch objecten te definiëren en dan eigenschappen toe te voegen naar believen. Omdat het in feite een dynamic is, erft het ook dezelfde voordelen en nadelen, zoals in vorig artikel besproken werd. Als bonus heeft ExpandoObject de INotifyPropertyChanged interface, die zal gewaardeerd worden bij een WPF toepassing bijvoorbeeld.