在使用 .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) 和 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
是 lambda 中对父作用域中变量的引用。就像是:
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 表达式进行此类优化?