我有一些代码,使用System.Linq.Expressions和Expression.Lambda>.Compile()等方法生成各种Func<>委托。我想将生成的函数序列化成程序集以供后续使用。过去,我曾使用System.Reflection.Emit做过一些工作,但现在既然使用了Linq Expressions,我不想再走那条路了。
是否有机制可以序列化编译后的表达式或从Expressions命名空间到Emit命名空间的桥梁?
编辑
一些背景信息: 我正在开发一个查询引擎(主要是为了自己的学习和兴趣)。给定一个SQL语句,我想将其解析并转换为Lambda函数,然后将其序列化到磁盘上以供以后(和重复)执行。
在伪代码中,我已完成以下步骤:
(其中,field、field1和field2是Type T的属性,A和B是Type T1的属性。)我可以传递任何
因此,我想将
是否有机制可以序列化编译后的表达式或从Expressions命名空间到Emit命名空间的桥梁?
编辑
一些背景信息: 我正在开发一个查询引擎(主要是为了自己的学习和兴趣)。给定一个SQL语句,我想将其解析并转换为Lambda函数,然后将其序列化到磁盘上以供以后(和重复)执行。
在伪代码中,我已完成以下步骤:
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是Type T的属性,A和B是Type 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(...)