在一个使用.NET 3.5构建的项目中,我正在使用LINQ表达式在运行时动态生成代码。这些LINQ表达式使用Compile方法进行编译,并存储为后续与LINQ to objects一起使用的谓词。
这些表达式有时非常复杂且难以调试。
以下是在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是lambda中对父范围内变量的引用。类似于:
原始表达式优化后应该如下所示:
{request => (Invoke(workEnvelopeHead => (workEnvelopeHead.Method = "[在此处输入我的变量的值]", request.WorkEnvelope.Head) And Invoke(body => > Invoke(value(Wombl.Scenarios.CannedResponses+<>c__DisplayClass78).isMatch, body.SingleOrDefault()),Convert(request.WorkEnvelope.Body.Any)))}
在编译之前,我该如何对LINQ表达式进行这样的优化?
这些表达式有时非常复杂且难以调试。
以下是在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是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 = "[在此处输入我的变量的值]", request.WorkEnvelope.Head) And Invoke(body => > Invoke(value(Wombl.Scenarios.CannedResponses+<>c__DisplayClass78).isMatch, body.SingleOrDefault()),Convert(request.WorkEnvelope.Body.Any)))}
在编译之前,我该如何对LINQ表达式进行这样的优化?