Compiler generiert notwendigen Code
Wie in den vorherigen Beispielen erläutert wurde, kann eine Instanz der Klasse ExpandoObject dynamisch um neue Mitglieder erweitert werden. Werden später die dynamisch hinzugefügten Mitglieder aufgerufen, muss jedoch eine Codebasis vorhanden sein, um eine Ausführung zu ermöglichen. Die Erstellung dieser Codebasis wird von dem Compiler übernommen. Listing 7 zeigt den generierten Code für die originale Methode Expando0.
Listing 7
public static void Expando0() { dynamic person = new ExpandoObject(); person.LastName = "Test"; string test = person.LastName; } [CompilerGenerated] private static classo__SiteContainer0 { // Fields public static CallSite > <>p__Site1; public static CallSite > <>p__Site2; public static CallSite > <>p__Site3; } public static void Expando0() { object person = new ExpandoObject(); if ( o__SiteContainer0.<>p__Site1 == null) { o__SiteContainer0.<>p__Site1 = CallSite > .Create(Binder.SetMember(CSharpBinderFlags.None, "LastName", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null), CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.Constant | CSharpArgumentInfoFlags.UseCompileTimeType, null) })); } o__SiteContainer0.<>p__Site1. Target( o__SiteContainer0.<>p__Site1, person, "Test"); if ( o__SiteContainer0.<>p__Site2 == null) { o__SiteContainer0.<>p__Site2 = CallSite >. Create(Binder.Convert(CSharpBinderFlags.None, typeof(string), typeof(Program))); } if ( o__SiteContainer0.<>p__Site3 == null) { o__SiteContainer0.<>p__Site3 = CallSite > .Create(Binder.GetMember(CSharpBinderFlags.None, "LastName", typeof(Program), new CSharpArgumentInfo[] { CSharpArgumentInfo .Create(CSharpArgumentInfoFlags.None, null) })); } string test = o__SiteContainer0.<>p__Site2. Target( o__SiteContainer0.<>p__Site2, o__SiteContainer0.<>p__Site3.Target ( o__SiteContainer0.<>p__Site3, person)); }
Die dynamisch hinzugefügten Mitglieder werden innerhalb einer privaten statischen Klasse verwaltet. Der Compiler erzeugt dafür eindeutige Namen, um nicht mit bestehenden Bezeichnern zu kollidieren. In dem Beispiel wurde die Klasse
Marc André Zhou arbeitet als Senior Consultant bei der Logica Deutschland GmbH & Co. KG. Seine Schwerpunkte liegen im Bereich SharePoint, Softwarearchitekturen und Frameworks, hier hauptsächlich im .NET-Umfeld. Sie erreichen ihn unter marc.andre.zhou@logica.com.