I was working on rewriting an application that had very specific use into .NET and currently had one simple branching point: for a certain value a part of code should get executed. Everything was very much hard coded, but the client was expanding ,and I wanted
to create a configuration file that could cater for future expansion.
I wanted to be able to define a condition "x == c" where x was a property of an runtime object that would vary over calls, and c was a constant. This condition should be defined in an XML file where it could be changed if needed. I also wanted to
ensure that any further conditions could also be defined in this manner, without the need to write any code.
That got me thinking: did C# have some way to evaluate a string as an expression during runtime, like VBScript's Eval()? It turns out, it did not.
One of the options I found around the internet was to create a complete class, compile the code into an assembly, load it into memory and call the function through reflection, but I immediately rejected this solution as it was clunky and inelegant, and a lot
of work for a check if "x == c".
I then came across
Pascal Ganaye's Eval3 library
. The library supported passing external variables through a class - just what I needed. It performed well enough (I had to modify the existing code to accommodate the equals operator) but I felt that it was a bit difficult
to maintain (had to write a function for each operator-combination type) and I was trying to move away from VB.NET.
I had been exposed to LINQ and Expression trees through my
and I realized that Expression trees could be compiled into functions, and all I needed was some sort of parser to build an expression tree from a string expression.
With a bit of help from Wikipedia, I borrowed an implementation of Dijkstra's
(NOTE: unfortunately the code sample has been removed, see the history to view the sample code) to handle the parsing, rewrote it in C#, threw in Expressions and had
the evaluator up and running.