c# - 如何发出 System.Linq.Expression?

标签 c# .net-4.0 lambda reflection.emit linq-expressions

我有一些代码可以生成各种 Func<>代表使用 System.Linq.ExpressionsExpression.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");

(其中fieldfield1field2类型TABType 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/

相关文章:

c# - 如何使用 RadioButtons 从 .NET 中的 Windows 窗体应用程序更新 Access 表?

c# - 我如何尝试创建一个文件,并返回一个值来指示它是否已创建?

c# - 在 Windows 窗体中切换图像

c# - 按钮不适用于更新面板

c# - ASP.Net webform 生成 Excel 文件到本地 PC 而不是服务器

c# - 在继续代码之前等待空闲线程槽

c# - 编译器如何从 LAMBDA 表达式推断委托(delegate)类型?

java - 如何使用 Java 8 streaming api 从 map 列表创建 map map

c# - Linq to SQL 左外连接使用 Lambda 语法和连接 2 列(复合连接键)

c# - FirstOrDefault 内联空检查