.NET 3.5 でビルドされたプロジェクトで、LINQ 式を使用して実行時にコードを動的に生成しています。LINQ 式は Compile メソッドを使用してコンパイルされ、後で LINQ to オブジェクトの述語として使用するために格納されます。
式は非常に複雑で、デバッグが難しい場合があります。
以下は、Visual Studio のデバッガー ビジュアライザーで表示される式の例です。
{request => (Invoke(workEnvelopeHead => (workEnvelopeHead.Method = value(Wombl.Scenarios.CannedResponses+<>c_ DisplayClass58).pipeline), request.WorkEnvelope.Head) And Invoke(body => Invoke(value(Wombl.Scenarios) .CannedResponses+<>c _DisplayClass78).isMatch, body.SingleOrDefault()),Convert(request.WorkEnvelope.Body.Any)))}
上記のような式を最適化して、value(Wombl.Scenarios.CannedResponses+<>c__DisplayClass58).pipeline
式が変数の値である定数に置き換えられるようにしたいと考えています。
この特定のケースでvalue(Wombl.Scenarios.CannedResponses+<>c__DisplayClass58).pipeline
は、親スコープ内の変数へのラムダ内の参照です。何かのようなもの:
var pipeline = "[My variable's value here]";
// My lambda expression here, which references pipeline
// Func<RequestType, bool> predicate = request => ........ workEnvelopeHead.Method == pipeline ..........
最適化された元の式は次のようになります。
{request => (Invoke(workEnvelopeHead => (workEnvelopeHead.Method = "[My variable's value here]", request.WorkEnvelope.Head) And Invoke(body => > Invoke(value(Wombl.Scenarios.CannedResponses+<>c__DisplayClass78)) .isMatch, body.SingleOrDefault()),Convert(request.WorkEnvelope.Body.Any)))}
コンパイルする前に、実行時に LINQ 式に対してそのような最適化を行うにはどうすればよいですか?