05 May 2009 by Stuart Cam
StackOverflow.com is my new water cooler.
I had been thinking about writing a small C#-based DSL for a while and was getting hung up on how to express and evaluate expression trees, in particular conditional expressions and predicates. I was aware of the Predicate Builder framework, I have some ANTLR knowledge, so I figured I could write an ANTLR grammar and walk the AST to build a predicate in C#.
My real problem was struggling to find somebody I could talk design with whose eyes wouldn't glaze over after the first 10 seconds.
Cue StackOverflow from stage left.
I posted the question and within 24 hours I'd received two interesting takes on the problem. It appears as though my original plan was probably overbaked and that there was a much simpler solution available.
Code below:
using System;
using System.Linq.Expressions;
using System.Linq.Dynamic;
namespace ExpressionParser
{
class Program
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
static void Main()
{
const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
var p = Expression.Parameter(typeof(Person), "Person");
var e = DynamicExpression.ParseLambda(new[] { p }, null, exp);
var bob = new Person
{
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = new DateTime(2000,1,1)
};
var result = e.Compile().DynamicInvoke(bob);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
Before StackOverflow I really don't know where this interaction could have taken place.