Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何发出System.Linq.Expression?_C#_.net 4.0_Lambda_Reflection.emit_Linq Expressions - Fatal编程技术网

C# 如何发出System.Linq.Expression?

C# 如何发出System.Linq.Expression?,c#,.net-4.0,lambda,reflection.emit,linq-expressions,C#,.net 4.0,Lambda,Reflection.emit,Linq Expressions,我有一些代码,可以使用System.Linq.Expressions和Expression.Lambda.Compile()等生成各种Func委托。我希望能够将生成的函数序列化到程序集中供以后使用。在过去,我对System.Reflection.Emit做了一些工作,但现在使用Linq表达式,我不想再使用这种方法了 是否有一种机制可以将编译后的表达式或某种桥从Expressions命名空间序列化到Emit命名空间 编辑 上下文的一些背景: 我正在开发一个查询引擎(主要是为了我自己的启发和享受)。

我有一些代码,可以使用
System.Linq.Expressions
Expression.Lambda.Compile()
等生成各种
Func
委托。我希望能够将生成的函数序列化到程序集中供以后使用。在过去,我对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");

我不确定你的大局到底是什么,但纯粹看你的第二段,你可以编写纯粹的基于表达式的代码,构建它,然后使用“Reflection.Emit”语言插件在Reflector中打开你的程序集。这一元技巧将向您展示动态生成表达式/Lambda代码所需的Reflection.Emit语句


-我认为没有任何方法可以做到这一点。毕竟,
表达式
可以捕获任意的运行时值,这些值无法序列化到程序集中


似乎您可以通过调用
expr.Compile().Method.GetMethodBody().GetILAsByteArray()
以字节形式获取IL,然后将IL写入程序集中的
MethodBuilder
,然后将其写入文件。不幸的是,这不起作用-调用
GetMethodBody()
失败,因为委托是动态的。

LambdaExpression有一个以MethodBuilder为目标的方法。使用此选项和反射。Emit您应该能够创建一个类并将其写入程序集。

我想我看到了您的想法,但如果您查看我的编辑:在运行时计算输入之前,我不知道表达式的外观。
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(...)