Какой самый простой способ динамически генерировать код в .NET 4.5?

Я пишу определенный вид объект-картограф. В основном я хочу преобразовать изDataTable это имеет поляa, b а такжеc к объекту, который имеет свойстваa, b а такжеc (класс объекта будет написан от руки). Будет много разных DataTables и много разных классов, на которые они должны будут отображаться, поэтому я хочу создать общий механизм, который выполняет это копирование данных. По сути, я хочу следующую функцию:

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

Теперь я могу сделать это с помощью Reflection, но это медленно. Эта функция будет в основе структуры и будет использоваться часто. Так что я думаю о динамической генерации кода. Первый раз этот метод запускается на конкретномT он выполнит необходимое отражение и выдаст анонимный метод, который выполняет все необходимые преобразования. В следующий раз он просто запустит этот код. Это должно быть максимально эффективным.

Только одна проблема - я никогда не генерировал код во время выполнения. Как мне это сделать? я посмотрел наExpressions, но они могут делать только выражения, а не ряд утверждений.

Тогда есть CodeDOM иCSharpCodeProvider, Такого рода работы - я могу сгенерировать код C # в виде строки, скомпилировать его на лету, а затем получить ссылку. Однако он включает компилятор C # и генерирует совершенно новую сборку в памяти. Звучит немного ... тяжеловесно для одного простого метода.

Есть какой-то более простой способ? Что-то, что генерирует легкий анонимный метод, не прикрепленный к какой-либо сборке (или прикрепленный к существующей сборке)?

Хорошо, так как люди попросили пример.

Вот класс, написанный от руки

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

Вот DataTable, подготовленный вручную (в реальной жизни это будет из внешней библиотеки):

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

Вот метод, который должен быть сгенерирован на лету:

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

Я упустил некоторые другие вещи, которые мне нужны для краткости, но в этом суть проблемы.

Ответы на вопрос(4)

Ваш ответ на вопрос