public Func <Document, bool> CompileRule(EnabledRule r) { var paramDoc = Expression.Parameter(typeof(Document)); Expression expr = BuildExpr(r, paramDoc); return(Expression.Lambda <Func <Document, bool> >(expr, paramDoc).Compile()); }
Expression BuildExpr(EnabledRule r, ParameterExpression paramDoc) { var left = MemberExpression.Property(paramDoc, r.StatusName); ExpressionType tBinary; // is the operator a known .NET operator? if (ExpressionType.TryParse(r.StatusOperator, out tBinary)) { var right = Expression.Constant(r.StatusValue); // use a binary operation, e.g. 'Equal' -> 'doc.Status == 1' var exp = Expression.MakeBinary(tBinary, left, right); return(exp); } throw new Exception("Неизвестное выражение"); }