Dynamic in C# 4.0, Teil I: Einführung

Eines der Neuerungen in C# 4 ist die DLR (Dynamic Language Runtime). Hierbei ist das “dynamic” Keywort eines der zentralen Dinge. Ein dynamisches Objekt ist “ExpandoObject”. Dies kann man sich folgendermaßen generieren:
//dynamische Person
dynamic aPerson = new ExpandoObject();
aPerson.Name = "Mario Meir-Huber";
aPerson.Age = 25;
Wie man dabei sehen kann, wurde “Name” und “Age” dynamisch hinzugefügt. Es ist auch möglich, auf alle Properties in diesem dynamischen Objekt zuzugreifen. Das ExpandoObject implementiert ein “IDictionary<string, object>” um auf alle Members zuzugreifen. Somit kann man Membername, Inhalt und sogar Typ ausgeben!
private static void WriteDynobj(dynamic person)
{
IDictionary<string, object> p = person;

    foreach (var itm in p)
{
Console.WriteLine(string.Format("{0} ist vom Typ {1} und hat als Wert {2}", itm.Key, itm.Value.GetType(), itm.Value));
}
}
Dies sieht dann in der Konsole folgendermaßen aus:Damit es auch ausgegeben wird, muss aber vorher die Methode “WriteDynobj” aufgerufen werden:
Console.WriteLine("Durchgang 1\n");

//ausgabe der properties
WriteDynobj(aPerson);
Natürlich wäre das ganze nicht so spektakulär wenn man nicht auch Methoden entfernen könnte. Hierfür greift man einfach wieder auf das Dictionary zu und entfernt einen Key
private static void DeleteProperty(dynamic person, string property)
{
IDictionary<string, object> p = person;

    p.Remove(property);
}
Das ganze sollte auch noch aufgerufen werden:
//ich bin zu alt - alter weg!
DeleteProperty(aPerson, "Age");

Console.WriteLine("\nDurchgang 2\n");

WriteDynobj(aPerson);
Noch besser ist es aber, wenn Methoden hinzu kommen. Dies wird auch einfach mit der “Add” Methode des Dictionaries geregelt:
private static void AddProperty(dynamic person)
{
IDictionary<string, object> p = person;

    p.Add(new KeyValuePair<string, object>("Alter", 12));
}
… und natürlich auch wieder aufrufen:
//machen wir was dazu ...
Console.WriteLine("\nDurchgang 3\n");

AddProperty(aPerson);

WriteDynobj(aPerson);
Da das ganze ja sehr dynamisch ist kann man auch den soeben neu hinzugefügten Member im Code schreiben:
//noch besser:

aPerson.Alter++;

Console.WriteLine(string.Format("Ein Jahr mehr = {0}", aPerson.Alter));

Console.ReadLine();

Dies sind nur einige der vielen Vorteile der DLR in C# 4.0. Was es sonst noch so gibt und was MemberBinder, IndexBinder und dergleichen sind kommt in den nächsten Posting.