Jaki jest najprostszy sposób generowania kodu dynamicznie w .NET 4.5?

Piszę specyficzny rodzaj mapowania obiektów. Zasadniczo chcę przekonwertować zDataTable który ma polaa, b ic do obiektu, który ma właściwościa, b ic (klasa obiektu zostanie napisana ręcznie). Będzie wiele różnych tabel danych i wiele różnych klas, które będą musiały mapować, więc chcę stworzyć ogólny mechanizm, który wykona to kopiowanie danych. Zasadniczo chcę następującą funkcję:

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

Teraz mogę to zrobić za pomocą Reflection, ale to jest powolne. Ta funkcja będzie podstawą struktury i będzie często używana. Myślę więc o dynamicznym generowaniu kodu. Po raz pierwszy ta metoda jest uruchamiana na określonym poziomieT wykona niezbędną refleksję i wyemituje anonimową metodę, która wykona wszystkie odpowiednie mapowania. Następnym razem uruchomi ten kod. Powinno to być tak skuteczne, jak to możliwe.

Tylko jeden problem - nigdy nie emitowałem kodu w czasie wykonywania. Jak mogę to zrobić? spojrzałem naExpressions, ale mogą robić tylko, cóż, wyrażenia, a nie serię wypowiedzi.

Potem jest CodeDOM iCSharpCodeProvider. Ten rodzaj pracy - mogę wygenerować kod C # jako ciąg znaków, skompilować go w locie, a następnie uzyskać referencję. Jednak wymaga kompilatora C # i generuje cały nowy zespół w pamięci. Brzmi trochę ... ciężko za jedną prostą metodę.

Czy jest jakiś prostszy sposób? Coś, co generuje lekką, anonimową metodę niezwiązaną z żadnym zespołem (lub dołączoną do istniejącego zespołu)?

OK, ponieważ ludzie prosili o przykład.

Oto klasa, napisana ręcznie

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

Oto DataTable, przygotowana ręcznie (w prawdziwym życiu, będzie pochodzić z zewnętrznej biblioteki):

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

Oto metoda, którą należy wygenerować w locie:

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

Pominąłem kilka innych rzeczy, których potrzebuję do zwięzłości, ale to jest właśnie to zagadnienie.

questionAnswers(4)

yourAnswerToTheQuestion