我有一些代码可以使用等生成各种委托Func<>
。我希望能够将生成的函数序列化为程序集以供以后使用。过去我用 System.Reflection.Emit 做了一些事情,但现在 Linq 表达式我不想再走那条路了。System.Linq.Expressions
Expression.Lambda<Func<>>.Compile()
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是T 类型的属性,A和B是T1 类型的属性。我可以传递<T>
toquery
和 get 的任何枚举,并且它的枚举<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(...)