Как вы получаете свойства, операторы и значения из выражения> Предикат? - PullRequest
6 голосов
/ 07 ноября 2011

Есть ли способ извлечь свойства, оператор и соответствующее значение из Expression<Func<T>,bool>?Учитывая следующий пример:

var customers = GetCustomers();
var customerQuery = customers.Where(x=> x.CustomerID == 1 
    && x.CustomerName == "Bob"); // The query is for illustration only

Мне нужно иметь возможность получить что-то вроде следующего:

Property: CustomerID
Operator: Equals
Value:    1

Property: CustomerName
Operator: Equals
Value:    Bob

Я уже написал что-то, что может вытащить имя свойстваExpression, но я не могу выяснить, где хранятся значение и оператор, хотя это довольно ясно видно в свойстве Expression DebugView.

Ответы [ 2 ]

8 голосов
/ 07 ноября 2011

Оператор будет на BinaryExpression Method, то есть узле Equals. Вам также следует взглянуть на выражения .NodeType, которые многое раскрывают (должно быть Equal).

Значения обычно будут в ConstantExpression в .Right этого BinaryExpression или в случае захваченной переменной: capture-context будет будет ConstantExpression, поэтому значение будет MemberExpression больше ConstantExpression (вам нужно выяснить, является ли элемент FieldInfo против PropertyInfo, и извлечь значение с помощью .GetValue(...) на этом).

3 голосов
/ 07 ноября 2011

В дополнение к ответу Марка Грэйвелла (+1 там) я просто добавлю, что стоит взглянуть на класс ExpressionVisitor (из коробки в .Net 4; MSDN имеетпример, который вы можете скопировать / вставить для 3.5).Это делает написание кода для извлечения определенных типов выражений очень и очень простым.

В вашем случае вы захотите переопределить его VisitBinary метод.

Я обычно используюнапример, класс, в который я помещаю интересующие меня выражения в список только для чтения, который я затем делаю общедоступным в своей реализации класса.Вы не используете его для переписывания выражения.

...