У меня есть некоторый код, который генерирует различные Func<>
делегаты, используя System.Linq.Expressions
и Expression.Lambda<Func<>>.Compile()
и т. Д. Я хотел бы иметь возможность сериализовать сгенерированные функции в сборку для последующего использования. В прошлом я кое-что делал с System.Reflection.Emit, но теперь, когда в выражениях Linq я бы больше не хотел идти этим путем.
Существует ли механизм для сериализации скомпилированного выражения или какой-то мост из пространства имен Expressions
в пространство имен Emit
?
Редактировать
Некоторый фон для контекста:
Я работаю над механизмом запросов (в основном для собственного назидания и удовольствия). Учитывая оператор SQL, я хотел бы проанализировать и преобразовать его в лямбда-функцию, а затем сериализовать на диск для последующего (и повторного выполнения).
В псевдокоде я нахожусь к этому пункту:
Func<IEnumerable<T>, IEnumerable<T1>> query = Query.Parse<T, T1>("Select field AS A, field1 AS B from T where T.field2 > 5");
(где field , field1 и field2 являются свойствами Тип T и A и B являются свойствами Тип T1 .
и я могу передать любое перечисление от <T>
до query
и получить обратно и перечисление <T1>
, которое соответствует критериям запроса.
Так что я бы хотел сериализовать query
на диск как уже скомпилированную сборку, чтобы позже я мог загрузить его и оценить различные наборы <T>
без разбора и компиляции. Я представляю что-то вроде:
AssemblyBuilder builder = new AssemblyBuilder(...);
ModuleBuilder module = builder.DefineDynamicModule(...);
TypeBuilder type = module.DefineType(...);
type.AddMethod(query); // <--- where this piece does not exist as far as I know
builder.Emit(...)