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

Von Mario Meir-Huber Autor Feed 4. November 2009 10:18

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:

image

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();

image

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.

Comments (2) -

>

11/4/2009 7:26:44 PM #

Hallo Mario,

gute Einführung, leicht zu verstehen und auch interessant. Ein kleines Problem habe ich aber entdeckt. Du schreibst: "Natürlich wäre das ganze nicht so spektakulär wenn man nicht auch Methoden entfernen könnte. ...", zeigst dann aber Beispiele mit Properties: "p.Remove(property);".

Das gleiche dann auch mit hinzufügen von Properties in dem nächsten Beispiel.
Sonst super, keep blogging und warte schon auf die nächsten Teile.

George Österreich

>

11/5/2009 2:21:33 PM #

Hi George,

danke für Deinen Beitrag!

wie ich das geschrieben habe, habe ich schon an den nächsten Blogeintrag gedacht -> es geht nämlich nicht nur mit Properties sondern auch mit Methoden. Die Bezeichnung "Members" wäre in diesem Fall also die einzig richtige, da dies für Properties und Methoden/Funktionen steht!

Viele Grüße,

Mario

Mario Meir-Huber Österreich

Pingbacks and trackbacks (3)+

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

www.microsoft.com/austria | © 2009 Microsoft Corporation. Alle Rechte vorbehalten.
BlogEngine.NET 2.5.0.6 powered by atwork