dka*_*man 16 c# lambda reflection.emit .net-4.0 linq-expressions
我有一个产生各种一些代码Func<>使用委托System.Linq.Expressions和Expression.Lambda<Func<>>.Compile()等等,我想能够序列化生成的函数为供以后使用的组件.在过去,我已经使用System.Reflection.Emit做了一些事情,但是现在Linq表达式我宁愿不再去那条路了.
是否有一种机制可以将已编译的表达式或某种桥接从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");
Run Code Online (Sandbox Code Playgroud)
(其中字段,字段1和字段2是性能T型和甲和乙是属性类型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(...)
Run Code Online (Sandbox Code Playgroud)
我不确定你的大局到底是什么,但纯粹看看你的第二段,你可以编写纯基于表达式的代码,构建它,然后使用“Reflection.Emit”语言插件在 Reflector 中打开你的程序集。这段元元技巧将向您展示动态生成表达式/Lambda 代码所需的 Reflection.Emit 语句。
-奥辛