Как построить дерево выражений для многоуровневого ссылочного свойства (связанного свойства)? - PullRequest
1 голос
/ 30 июня 2011

Например, допустим, у меня есть строковое свойство «Document.DocumentType.DocumentCode», где DocumentCode - это десятичный тип, допускающий обнуляемость.

Как мне построить дерево выражений для этого: x.Document.DocumentType.DocumentCode.GetValueOrDefault() == 4?

Для моего реального случая я не буду точно знать, как будет выглядеть свойство связанной строки или уровни свойств.

1 Ответ

4 голосов
/ 30 июня 2011

Ну, это дерево:

  • Соответствие равенства, где левая часть сложна, а правая часть является константным выражением 4.
  • LHS - это вызов метода GetValueOrDefault() on (выражение)
  • Выражение из предыдущего шага является выражением доступа к свойству DocumentCode on (выражение)
  • Выражение из предыдущего шага является выражением доступа к свойству DocumentType on (выражение)
  • Выражение из предыдущего шага является выражением доступа к свойству Document для ParameterExpression

Начните снизу и постройте его оттуда. Другими словами, если вы знаете, что у вас будут только свойства, вам нужно:

  • Разделить строку на "."
  • Создать ParameterExpression
  • Цикл вокруг набора свойств, добавляя каждый слой или доступ к свойствам каждый раз, например.

    currentExpression = Expression.Property(currentExpression, propertyName);
    
  • Добавить вызов метода в выражение

  • Создайте сравнение на равенство, используя это и любое заданное вами постоянное значение
...