コード例 #1
0
        private static ILogicalExpression Factorize(object expression, FactorizeParams factorizeParams, bool inverted)
        {
            var rootOrExpression = factorizeParams.CompositionFactory(LogicalOperator.Or);

            expression = factorizeParams.ConvertFactory(expression, inverted);

            var invertedExpression = expression as IInvertedLogicalExpression;

            if (invertedExpression != null)
            {
                expression = Factorize(invertedExpression.Expression, factorizeParams, !inverted);
            }

            var compositionExpression = expression as ILogicalExpression;

            if (compositionExpression != null)
            {
                var subExpressions = compositionExpression.Expressions ?? Enumerable.Empty <object>();
                foreach (var subExpression in subExpressions)
                {
                    var factorizedSubExpression = Factorize(subExpression, factorizeParams, inverted);
                    switch (compositionExpression.Operator)
                    {
                    case LogicalOperator.And:
                        MultiplyFactorizedExpression(rootOrExpression, factorizedSubExpression.Expressions.Enumerate <object>().ToArray());
                        break;

                    case LogicalOperator.Or:
                        foreach (var sub in factorizedSubExpression.Expressions)
                        {
                            rootOrExpression.AddExpression(sub);
                        }
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }

            if (!rootOrExpression.Expressions.Enumerate <object>().Any())
            {
                var rootAndExpression = factorizeParams.CompositionFactory(LogicalOperator.And);
                rootOrExpression.AddExpression(rootAndExpression);
            }

            if (compositionExpression == null && expression != null)
            {
                rootOrExpression.Expressions.Enumerate().OfType <ILogicalExpression>().First().AddExpression(expression);
            }

            return(rootOrExpression);
        }
コード例 #2
0
        public static ILogicalExpression Factorize(this object expression, FactorizeParams factorizeParams)
        {
            if (factorizeParams == null)
            {
                throw new ArgumentNullException(nameof(factorizeParams));
            }
            if (factorizeParams.CompositionFactory == null)
            {
                throw new ArgumentNullException(nameof(factorizeParams));
            }
            if (factorizeParams.ConvertFactory == null)
            {
                throw new ArgumentNullException(nameof(factorizeParams));
            }

            return(Factorize(expression, factorizeParams, false));
        }