Sí, debería ser posible. Sin embargo, es bastante más complicado de lo que parece en la superficie implementar una nueva escritura del árbol de expresiones correctamente. Especialmente si desea poder manejar correctamente campos, propiedades, propiedades indexadas, llamadas a métodos y otras construcciones que son válidas en expresiones arbitrarias.
Tampoco es la operación que mejor funciona, ya que para evaluar la expresión tiene que compilar dinámicamente el árbol de expresiones en una función lambda cada vez.
Hay implementation on this pattern on CodePlex. Nunca lo he usado personalmente, así que no puedo decir qué tan bien implementado es, o si maneja todos los casos que he descrito.
Una alternativa a la creación de una expresión árbol de re-escritor, es escribir Maybe()
para aceptar una función lambda (en lugar de un árbol de expresión) y la captura de cualquier ArgumentNullException
tirado, volviendo default(T)
en esos casos. Frota a muchas personas de la manera incorrecta para usar excepciones para el control de flujo de esta manera ... pero ciertamente es una implementación más sencilla para hacerlo bien. Personalmente, lo evito porque puede enmascarar errores de referencia nulos dentro de métodos llamados como parte de la expresión, lo cual no es deseable. respuesta
La creación de nuevos objetos puede tener consecuencias imprevistas. – Amy