2010-08-11 16 views
5

Que no haya:Obtención de Valores de ExpressionTrees

Expression<Func<Customer, bool>> expression = c => c.Name == "John"; 

ahora consigo el valor mediante el uso de:

string myvalue = ((ConstantExpression) bin.Right).Value; 

ahora Que no haya:

string x = "John"; 
Expression<Func<Customer, bool>> expression = c => c.Name == x; 

Ahora entiendo que

string myvalue = ((ConstantExpression) bin.Right).Value; 

generaría un error porque bin.right aquí no es constantexpression es una expresión de campo pero la pregunta es ¿cómo obtengo el valor (John) de esto?

Respuesta

11

Puede envolver la expresión en una lambda y luego compilarla y evaluarla. Eso te daría el valor sin importar qué tipo de expresión sea.

string myvalue = Expression.Lambda<Func<string>>(bin.Right).Compile().Invoke(); 

Tenga en cuenta que esto no funcionará si el parámetro c se utiliza en el lado derecho de la expresión, ya que no se puede definir. También tenga en cuenta que esto le dará el valor actual del lado derecho cuando llame a Invoke, y las llamadas posteriores podrían devolver diferentes valores si el campo en el objeto cambia.


Actualización: Si no conoce el tipo del lado derecho en el momento de la compilación, se puede utilizar el objeto, pero esto va a romper para este tipo de valor, como int. Deberá usar Expression.Convert para forzar que los tipos de valores estén encuadrados antes de devolverlos. Esto funcionará para ambos tipos de valor y tipos de referencia:

object myvalue = Expression.Lambda<Func<object>>(
    Expression.Convert(bin.Right, typeof(object))).Compile().Invoke(); 

También es posible usar una lambda sin tipo y DynamicInvoke:

object myvalue = Expression.Lambda(bin.Right).Compile().DynamicInvoke(); 
+0

agradable, pero ahora tengo que encontrar una manera de acceder al tipo de que causa ofcource es su func así que no puedo lanzar int al objeto por alguna razón así que si estoy devolviendo int y puse Object en func daría error de compilación – Stacker

+0

impresionante, muchas gracias que lo hice, como pueden ver en mi otro preguntas que he estado tratando de aprender expressiontrees por un tiempo, lo malo es que puedo nt encontrar buenos recursos al respecto – Stacker

+0

nice edit Quartermeister, ¿puedo pedirte una referencia para desarrollar mis conocimientos en árboles de expresiones como un libro o un sitio? muchas gracias – Stacker

Cuestiones relacionadas