Oui, cela devrait être possible. Cependant, il est un peu plus compliqué qu'il n'y paraît sur la surface pour implémenter correctement un réécrivain d'arbre d'expression. Surtout si vous voulez gérer correctement les champs, les propriétés, les propriétés indexées, les appels de méthodes et d'autres constructions valides dans des expressions arbitraires.
Il peut également ne pas être l'opération la plus performante puisque pour évaluer l'expression vous devez compiler dynamiquement l'arbre d'expression dans une fonction lambda à chaque fois.
Il existe un implementation on this pattern on CodePlex. Je ne l'ai jamais utilisé personnellement, donc je ne peux pas dire si c'est bien implémenté, ou s'il gère tous les cas que j'ai décrits.
Une alternative à la création d'un arbre d'expression re-écrivain, est d'écrire Maybe()
d'accepter une fonction lambda (plutôt que d'un arbre d'expression) et attraper tout ArgumentNullException
jeté, le retour default(T)
dans ces cas. Il frotte à beaucoup de gens la mauvaise façon d'utiliser des exceptions pour le contrôle de flux de cette façon ... mais c'est certainement une implémentation plus facile à faire. Personnellement, je l'évite moi-même car il peut masquer des erreurs de référence nulles dans les méthodes appelées dans le cadre de l'expression, ce qui n'est pas souhaitable.
La création de nouveaux objets peut avoir des conséquences imprévues. – Amy