Funktion und Verwendung der Klasse ExpandoObject (Teil 2)
Kommentare

Zunächst wird eine neue Instanz der Klasse ExpandoObject angelegt. Zu beachten ist hier die Besonderheit, dass auf der linken Seite das dynamic-Schlüsselwort zur Festlegung des Typs zum Einsatz kommt.

Zunächst wird eine neue Instanz der Klasse ExpandoObject angelegt. Zu beachten ist hier die Besonderheit, dass auf der linken Seite das dynamic-Schlüsselwort zur Festlegung des Typs zum Einsatz kommt. Würde statt des Schlüsselworts dynamic die Klasse ExpandoObject verwendet, könnte der Typ nicht dynamisch erweitert werden. Anschließend wird auf der erzeugten Instanz die Methode Save aufgerufen. Da es sich bei person um einen dynamischen Typ handelt, meldet der Compiler keinen Fehler. Erst zur Laufzeit kommt es bei der Ausführung zu der Fehlermeldung ‚System.Dynamic.ExpandoObject‘ does not contain a definition for ‚Save‘ (Abb. 1). Bei der Verwendung dynamischer Konstrukte muss daher während der Implementierung sehr genau auf die korrekte Schreibweise von Methoden und Eigenschaften geachtet werden. In dem zuvor gezeigten Beispiel führte der Aufruf der noch nicht existierenden Methode Save zu einem Fehler. Im Folgenden wird nun gezeigt, wie dem Objekt person dynamisch neue Mitglieder hinzugefügt werden können.

Abb. 1: Fehler beim Aufruf einer nicht vorhandenen Methode
Abb. 1: Fehler beim Aufruf einer nicht vorhandenen Methode

Mitglieder dynamisch hinzufügen

Mit der in Listing 2 angelegten Instanz vom Typ ExpandoObject kann ohne eigene Mitglieder noch nicht viel erreicht werden. Listing 3 zeigt, wie dem Objekt dynamisch neue Eigenschaften hinzugefügt werden können.

Listing 3

public static void Expando2()
    {
      dynamic people = new List(); 
      dynamic person = new ExpandoObject();
      person.LastName = "Mustermann";
      person.FirstName = "Heinz";
      people.Add(person);
      person = new ExpandoObject();
      person.LastName = "Musterfrau";
      person.FirstName = "Erna";
      people.Add(person);
    }  

Als Beispiel wird dynamisch eine Struktur zur Verwaltung von Personendaten realisiert. Neue Eigenschaften können dem Objekt durch einfachen Aufruf der gewünschten Eigenschaft hinzugefügt werden. Wie Listing 3 ebenfalls zeigt, können dynamische Objekte innerhalb von generischen Listen verwaltet werden. Als generischer Typ für die Listenobjekte ist dynamic zu verwenden. Möglich wäre es auch, den Typ ExpandoObject (Konkret: List) zu benutzen, das könnte allerdings in manchen Situationen Probleme verursachen, da in Wirklichkeit dynamische Objekte – also vom Typ dynamic – in der Liste abgelegt werden. Typischerweise besitzt eine Klasse, wenn es sich nicht um ein reines Data Transfer Object (DTO) handelt, auch aufrufbare Methoden. Auch einer Instanz vom Typ ExpandoObject können zur Laufzeit dynamisch Methoden hinzugefügt werden. Listing 4 zeigt dazu ein Beispiel und erweitert die dynamische Personenklasse um die Methoden GetFullName und PrintFullName.

Listing 4

public static void Expando3()
{
  dynamic people = new List();
  dynamic person = new ExpandoObject();
  // ... ausgelassen ...
  person.GetFullName = new Func((p) => {
    return string.Format("{0} {1} {2}", p.Salutation, p.FirstName, p.LastName);
  });
  person.PrintFullName = new Action((p) =>
  {
    Console.WriteLine("Mein Name ist: {0} {1} {2}", 
                      p.Salutation, p.FirstName, p.LastName);
  });
}  

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -