В проекте, созданном на .NET 3.5, я использую выражения LINQ для динамического создания кода во время выполнения. Выражения LINQ компилируются с использованием метода Compile и сохраняются для последующего использования в качестве предикатов с LINQ для объектов.
Выражения иногда довольно сложны и трудны для отладки.
Ниже приведен пример выражения, просматриваемого с помощью визуализатора отладчика в Visual Studio.
{запрос
=> (Invoke (workEnvelopeHead
=> (workEnvelopeHead.Method = значение (Wombl.Scenarios.CannedResponses + <> c_ DisplayClass58) .pipeline),
request.WorkEnvelope.Head)
И вызывать (body =>
Invoke (значение (Wombl.Scenarios.CannedResponses + <> с _DisplayClass78) .isMatch,
body.SingleOrDefault ()), конвертировать (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 = "[Здесь значение моей переменной]",
request.WorkEnvelope.Head) и Invoke (body =>> Invoke (значение (Wombl.Scenarios.CannedResponses + <> c__DisplayClass78) .isMatch,
body.SingleOrDefault ()), конвертировать (request.WorkEnvelope.Body.Any)))}
Как я могу выполнить такую оптимизацию во время выполнения для выражения LINQ перед компиляцией?