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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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