Всё началось с того, что был нужен простенький DSL, который бы возвращал бы bool по некоторому словарю объектов, т.е. удовлетворяет ли он условию заданному через DSL. Было у меня два поста, о том как написать свой парсер языка и о том, как с помощью Expressions tree, обработать дерево языка построенное парсером. Так я и делал вначале. Получилось несколько громоздко, меня покритиковали :) Поэтому решил упростить себе и другим жизнь, вот на этой странице
C# Samples прочитав внимательно соглашение и нажав I accept, можно скачать набор примеров, в частности большое количество примеров по LINQ. И среди них есть папка LinqSamples\DynamicQuery. Там есть файл Dynamic.cs с набором классов, которые делают то, что я описал ранее, т.е. преобразуют текстовую запись LINQ в Expressions tree и далее компиляция его в делегат. Это просто замечательно, то что доктор прописал, готово и отлично работает. Внутри папки есть Dynamic Expressions.html файл с подробной инструкцией, а также таблицей поддерживаемых методов.
Вот например, то что я писал выше, создание простого калькулятора из примера:
- ParameterExpression argument = Expression.Parameter(typeof(int), "argument");
- LambdaExpression e = DynamicExpression.ParseLambda(new ParameterExpression[] { argument }, null, "argument + argument");
Я использовал в своём приложении, очень удобно. Единство, пришлось сделать небольшой хак.