2011-11-07 7 views
6

¿Hay alguna forma de extraer las propiedades, el operador y el valor coincidente de Expression<Func<T>,bool>? Teniendo en cuenta el siguiente ejemplo:¿Cómo se obtienen las propiedades, operadores y valores de un predicado Expression <Func <T, bool>>?

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

que necesito para ser capaz de salir algo como lo siguiente:

Property: CustomerID 
Operator: Equals 
Value: 1 

Property: CustomerName 
Operator: Equals 
Value: Bob 

ya he escrito algo que se puede sacar el nombre de la propiedad de una expresión, pero Parece que no puedo encontrar dónde se guardan el valor y el operador, aunque es bastante visible en la propiedad DebugView de Expression.

Respuesta

8

El operador estará en BinaryExpression 's Method que es el nodo Equals. También debe mirar las expresiones .NodeType, que revela mucho (debe ser Equal).

Los valores estará típicamente en un ConstantExpression en el .Right de que BinaryExpression, o en el caso de una variable capturado: la captura-contexto será el ConstantExpression, por lo que el valor será un MemberExpression sobre ConstantExpression (necesitará investigar si el miembro es FieldInfo vs PropertyInfo, y buscar el valor a través de .GetValue(...) en eso).

+0

Excelente, gracias. Solo tuve que convertir 'predicate' usando' (BinaryExpression) predicate.Body' y ahora todo es bastante obvio. Saludos, Marc. – GenericTypeTea

3

Además de la respuesta de Marc Gravells (+1), solo añadiré que vale la pena echar un vistazo a la clase ExpressionVisitor (lista para usar en .NET 4; MSDN tiene un ejemplo que puede copiar/pegar para 3.5). Hace que escribir código para extraer ciertos tipos de expresiones sea muy fácil.

En su caso, usted estaría buscando anular su método VisitBinary.

Normalmente utilizo la clase para insertar las expresiones que me interesan en una lista de solo lectura, por ejemplo, que luego publico públicamente sobre mi implementación de la clase. No lo estás usando para reescribir la expresión.

+0

+1, gracias. Ciertamente hace que sea más fácil encontrar las expresiones binarias, pero dejaré la respuesta de Marc como aceptada, ya que dice cómo extraer la información que necesito. – GenericTypeTea

+0

Sí, estoy de acuerdo, la respuesta de Marc te da los detalles para esta pregunta y merece el tic; el mío solo está ofreciendo una forma simple de lograr lo que ha sugerido :) –

Cuestiones relacionadas