Я использовал выражения для создания тривиального предметно-ориентированного языка. Это используется в реальном приложении, где я работаю, поэтому это не игрушечный проект.
Я в основном создал свободный интерфейс, который позволяет мне создавать Predicate<T>
делегатов, что-то вроде:
Predicate<MyClass> condition = (new ConditionBuilder()).GreaterThanConst(9)
.And()
.LessThanConst(4)
.ToPredicate();
Каждый метод добавляет соответствующее выражение в текущее дерево. Чем ToPredicate
компилирует выражение для делегата.
Метод GreaterThanConst
выглядит примерно так:
public ConditionBuilder GreaterThan(object constant)
{
condition = Expression.GreaterThan(Expression.Parameter(constant.GetType()), Expression.Constant(constant));
return this;
}
Где condition
- член, содержащий дерево, которое строится (выращивается?).
Чтобы разобрать ваше выражение, вам нужно написать что-то вроде:
Expression<Func<YourClass, bool>> expr = x => x.Process == "On" && x.Name == "Goofy";
Тогда вы можете посмотреть через сгенерированное дерево выражений и посмотреть, что там.