Was ist der einfachste Weg, um Code in .NET 4.5 dynamisch zu generieren?

Ich schreibe eine bestimmte Art von Objekt-Mapper. Grundsätzlich möchte ich von einem konvertierenDataTable das hat die feldera, b undc auf ein Objekt mit Eigenschaftena, b undc (Die Klasse des Objekts wird von Hand geschrieben). Es wird viele verschiedene DataTables und viele verschiedene Klassen geben, denen sie zugeordnet werden müssen. Daher möchte ich einen generischen Mechanismus zum Kopieren dieser Daten erstellen. Grundsätzlich möchte ich folgende Funktion:

public T Map<T>(DataTable t) where T: new() { ... }

Jetzt kann ich das mit Reflection machen, aber das ist langsam. Diese Funktion ist das Kernstück des Frameworks und wird häufig verwendet. Also denke ich über dynamische Code-Generierung nach. Das erste Mal, dass diese Methode auf einem bestimmten Computer ausgeführt wirdT Es führt die erforderliche Reflektion durch und gibt eine anonyme Methode aus, die alle erforderlichen Zuordnungen vornimmt. Beim nächsten Mal wird nur dieser Code ausgeführt. Dies sollte so performant wie möglich sein.

Nur ein Problem - ich habe nie Code zur Laufzeit ausgegeben. Wie mache ich das? Ich sah mich umExpressions, aber sie können nur gut Ausdrücke, nicht eine Reihe von Aussagen tun.

Dann gibt es CodeDOM undCSharpCodeProvider. So etwas funktioniert - ich kann C # -Code als Zeichenfolge generieren, ihn im laufenden Betrieb kompilieren und dann eine Referenz abrufen. Es bezieht jedoch den C # -Compiler mit ein und generiert eine ganz neue In-Memory-Assembly. Klingt ein bisschen ... Schwergewicht für eine einfache Methode.

Gibt es einen einfacheren Weg? Etwas, das eine schlanke, anonyme Methode generiert, die keiner Assembly (oder einer vorhandenen Assembly) zugeordnet ist?

OK, da Leute nach einem Beispiel gefragt haben.

Hier ist eine Klasse, die von Hand geschrieben wurde

class MyBusinessObject
{
    public int a;
    public string b { get; set; }
}

Hier ist eine von Hand erstellte Datentabelle (im wirklichen Leben stammt diese aus einer externen Bibliothek):

DataTable t = new DataTable();
t.AddColumn("a", typeof(int));
t.AddColumn("b", typeof(string));
t.AddRow(42, "Meaning");

Hier ist die Methode, die im laufenden Betrieb generiert werden sollte:

(DataRow drow, MyBusinessObject o) =>
{
    o.a = (int)drow["a"];
    o.b = (string)drow["b"];
}

Ich habe einige andere Dinge weggelassen, die ich aus Gründen der Kürze brauche, aber das ist das Kernstück des Problems.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage