This article has been localized into German by the community.
Das ExpandoObject
Wie wir in einem früheren Artikel gesehen haben, können wir das "dynamic" -Schlüsselwort verwenden, um ein Objekt zu erstellen, in dem wir die Eigenschaften definieren, ohne die Klasse zuerst definieren zu müssen. Was wir nicht mit einem dynamischen Objekt tun können, ist das dynamische Hinzufügen von Eigenschaften, nachdem das Objekt initialisiert wurde. Wenn Sie diese spezifische Fähigkeit benötigen, bietet C# eine Lösung für Sie: Das ExpandoObject. Lassen Sie uns direkt zu einem Beispiel springen, damit Sie sehen können, wie einfach es ist:
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);
Sie werden feststellen, dass ich das Objekt mit dem dynamischen Typ deklariere, obwohl ich ein ExpandoObject instanziiere. Der Grund dafür ist, dass der Compiler, wenn das Objekt als ExpandoObject deklariert wurde, es überprüfen würde und sofort über das Fehlen der Eigenschaften, die wir dafür erfinden (Name, Alter usw.), klagen würde. Wir können dies verhindern, indem wir es als dynamisch deklarieren, was, wie wir im vorhergehenden Artikel erfahren haben, verhindern wird, dass der Compiler nach der Existenz der Eigenschaften sucht, die wir verwenden.
Eine coole Sache ist, dass ein "ExpandoObject" natürlich Eigenschaften haben kann, die auch Expandierende Objekte sind, so dass Sie komplexe Typen im laufenden Betrieb erstellen können, wie in diesem Beispiel:
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 + "]");
Ich ändere einfach die HomeTown-Eigenschaft von einer Zeichenfolge zu einem ExpandoObject und füge dann Eigenschaften hinzu, in diesem Fall den Namen und die Postleitzahl der Stadt. Aber damit muss nicht Schluss sein - wir können dem Objekt sogar Methoden hinzufügen, und zwar mit Hilfe einiger ziemlich raffinierter Tricks:
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());
Ziemlich nette Sachen, aber was ist ein ExpandoObject wirklich? Es implementiert mehrere interessante Schnittstellen, aber eine davon ist IDictionary< string, object> - Das bedeutet, dass Ihr ExpandoObject unter all dem syntaktischen Zucker im Grunde nur ein Wörterbuch ist, das Objektwerte basierend auf String-Schlüsseln enthält. Das bedeutet auch, dass das Iterieren über ein ExpandoObject genauso einfach ist wie das Iterieren durch ein normales "Dictionary". Das ist sehr 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);
}
Zusammenfassung
Mit dem ExpandoObject-Typ können Sie Objekte im laufenden Betrieb definieren und dann jederzeit Eigenschaften hinzufügen. Da es sich im Grunde um einen dynamischen Typ handelt, erbt es die gleichen Vor- und Nachteile, die wir im vorherigen Artikel besprochen haben. Als Bonus implementiert das ExpandoObject die INotifyPropertyChanged-Schnittstelle, die Sie definitiv schätzen werden, wenn Sie z.B.: WPF Anwendungen erstellen.