Какой самый простой способ динамически генерировать код в .NET 4.5?
Я пишу определенный тип объект-картограф. В основном я хочу преобразовать изDataTable
у которого есть поля,a
b
а такжеc
к объекту, который имеет свойства,a
b
а также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"];
}
мы пропустили некоторые другие вещи, которые мне нужны для краткости, но этосуть проблемы.