2011-11-07 10 views
6

Esiste un modo per estrarre le proprietà, l'operatore e il valore corrispondente da un Expression<Func<T>,bool>? Dato il seguente esempio:Come si ottengono proprietà, operatori e valori da un predicato Espressione <Func <T, bool>>?

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

ho bisogno di essere in grado di ottenere qualcosa di simile al seguente:

Property: CustomerID 
Operator: Equals 
Value: 1 

Property: CustomerName 
Operator: Equals 
Value: Bob 

ho già scritto qualcosa che può tirare fuori il nome della proprietà di un'espressione, ma Non riesco a capire dove si trovano il valore e l'operatore, sebbene sia abbastanza chiaramente visibile nella proprietà DebugView di Expression.

risposta

8

L'operatore si trova nello . Si dovrebbe anche guardare le espressioni .NodeType, che rivela molto (dovrebbe essere Equal).

I valori sarà tipicamente in un ConstantExpression nel .Right di tale BinaryExpression, o, nel caso di una variabile catturato: il cattura contesto sarà il ConstantExpression, quindi il valoresarà un MemberExpression su un ConstantExpression (sarà necessario verificare se il membro è un FieldInfo vs PropertyInfo e recuperare il valore tramite .GetValue(...) su quello).

+0

Eccellente, grazie. Bastava lanciare il 'predicato' usando' (BinaryExpression) predicate.Body' e ora tutto è piuttosto ovvio. Saluti Marc. – GenericTypeTea

3

Oltre alla risposta di Marc Gravells (+1), aggiungo che vale la pena dare un'occhiata alla classe ExpressionVisitor (pronta all'uso .Net 4; MSDN ha un esempio che è possibile copiare/incollare per 3,5). Rende molto semplice la scrittura di codice per estrarre determinati tipi di espressioni.

Nel tuo caso, stai cercando di ignorare il metodo VisitBinary.

Generalmente utilizzo la classe per inviare le espressioni che sono interessato a un elenco di sola lettura, ad esempio, che poi renderò disponibile pubblicamente sulla mia implementazione della classe. Non lo stai utilizzando per riscrivere l'espressione.

+0

+1, grazie. Certamente rende più facile trovare le espressioni binarie, ma lascerò la risposta di Marc come accettata, in quanto dice come estrarre le informazioni che richiedo. – GenericTypeTea

+0

Sì, sono d'accordo - la risposta di Marc ti dà i dadi e le viti per questa domanda e merita il segno di spunta; il mio offre solo un modo semplice per ottenere ciò che ha suggerito :) –