我有一些代码可以生成各种 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");
(其中field、field1 和field2 是类型T 和A的属性strong> 和 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(...)
最佳答案
LambdaExpression 有一个 CompileToMethod以 MethodBuilder 为目标的方法。使用这个和 Reflection.Emit 你应该能够创建一个类并将它写入程序集。
关于c# - 如何发出 System.Linq.Expression?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2345229/