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.