16

などを使用してさまざまなFunc<>デリゲートを生成するコードがいくつかあります。後で使用するために、生成された関数をアセンブリにシリアル化できるようにしたいと考えています。過去に私は System.Reflection.Emit でいくつかのことをしましたが、今では Linq Expressions でそのルートに再び行きたくありません。System.Linq.ExpressionsExpression.Lambda<Func<>>.Compile()

Expressionsコンパイルされた式または名前空間から名前空間へのある種のブリッジをシリアル化するメカニズムはありEmitますか?

編集

コンテキストの背景: 私はクエリ エンジンに取り組んでいます (ほとんどの場合、私自身の教育と楽しみのためです)。SQL ステートメントが与えられた場合、それを解析してラムダ関数に変換し、後で (そして繰り返し実行するために) ディスクにシリアル化します。

疑似コードでは、私はこの時点までです:

Func<IEnumerable<T>, IEnumerable<T1>> query = Query.Parse<T, T1>("Select field AS A, field1 AS B from T where T.field2 > 5");

(ここで、fieldfield1およびfield2T 型のプロパティであり、AおよびBT1 型<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(...)
4

3 に答える 3

4

LambdaExpression には、 MethodBuilder を対象とするCompileToMethodメソッドがあります。これと Reflection.Emit を使用すると、クラスを作成してアセンブリに書き込むことができるはずです。

于 2012-12-15T00:18:50.043 に答える
3

全体像が正確に何であるかはわかりませんが、純粋に2番目の段落を見ると、純粋な式ベースのコードを記述してビルドし、「Reflection.Emit」言語アドインを使用してリフレクターでアセンブリを開くことができます。このメタメタトリックは、Expression/Lambda コードを動的に生成するために必要な Reflection.Emit ステートメントを示します。

-オイシン

于 2010-02-26T22:24:48.490 に答える
3

これを行う方法はないと思います。結局のところ、Expressionアセンブリにシリアル化できなかった任意のランタイム値をキャプチャできます。

expr.Compile().Method.GetMethodBody().GetILAsByteArray()IL をバイトとして取得するために呼び出すことで、これを回避できるように思われます。これMethodBuilderは、ファイルに書き込むことができるアセンブリ内に書き込むことができます。残念ながら、これは機能しませんGetMethodBody()。デリゲートが動的であるため、呼び出しは失敗します。

于 2010-02-26T23:14:51.460 に答える