示例#1
0
        private IEntityChangeInformation ProcessExpression(Expression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
        {
            switch (expression.NodeType)
            {
            case ExpressionType.Assign:
                return(ProcessBinaryExpression((BinaryExpression)expression, entityChangeContainer, processedProperties));

            case ExpressionType.MemberAccess:
                return(ProcessMemberExpression((MemberExpression)expression, entityChangeContainer, processedProperties));

            case ExpressionType.Convert:
                return(ProcessConvertExpression((UnaryExpression)expression, entityChangeContainer, processedProperties));

            case ExpressionType.Constant:
                return(ProcessConstantExpression((ConstantExpression)expression, entityChangeContainer));

            case ExpressionType.Call:
                return(ProcessCallExpression((MethodCallExpression)expression, entityChangeContainer, processedProperties));

            case ExpressionType.Block:
                return(ProcessBlockExpression((BlockExpression)expression, entityChangeContainer, processedProperties));

            case ExpressionType.Lambda:
                return(ProcessLambdaExpression((LambdaExpression)expression, entityChangeContainer, processedProperties));
            }

            return(entityChangeContainer);
        }
示例#2
0
 public CompiledActionRule(Action <T> compiled, IEntityChangeInformation entityChangeInformation)
 {
     Compiled = compiled;
     EntityChangeInformation = entityChangeInformation;
 }
示例#3
0
 private IEntityChangeInformation ProcessBlockExpression(BlockExpression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
 {
     return(ProcessExpression(expression.Expressions.First(), entityChangeContainer, processedProperties));
 }
示例#4
0
 private IEntityChangeInformation ProcessLambdaExpression(LambdaExpression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
 {
     return(ProcessExpression(expression.Body, entityChangeContainer, processedProperties));
 }
示例#5
0
        private IEntityChangeInformation ProcessCallExpression(MethodCallExpression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
        {
            var expressionInfoAttribute = expression.Method.GetCustomAttribute <ExpressionInfoAttribute>();
            var skipArguments           = 0;

            if (expressionInfoAttribute?.ExpressionPurposeType == ExpressionPurposeType.Filtering)
            {
                skipArguments = 2;

                entityChangeContainer.Filter = new EntityChangeInformation
                {
                    Member = entityChangeContainer.Member
                };

                var filterLambdaExpression = expression.Arguments.FirstOrDefault(arg => (arg as LambdaExpression)?.ReturnType == typeof(bool));
                entityChangeContainer.Filter = ProcessExpression(filterLambdaExpression, entityChangeContainer.Filter, new HashSet <string>());
            }

            entityChangeContainer.Operation = expression.Method.Name + "(";

            entityChangeContainer = expression.Arguments.Skip(skipArguments)
                                    .Aggregate(entityChangeContainer, (accumulate, arg) => ProcessExpression(arg, accumulate, processedProperties));

            if (!entityChangeContainer.Operation.EndsWith(")"))
            {
                entityChangeContainer.Operation += ")";
            }

            return(entityChangeContainer);
        }
示例#6
0
        private IEntityChangeInformation ProcessBinaryExpression(BinaryExpression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
        {
            entityChangeContainer.Operation = expression.NodeType.ToString();

            entityChangeContainer = ProcessExpression(expression.Left, entityChangeContainer, processedProperties);

            return(ProcessExpression(expression.Right, entityChangeContainer, processedProperties));
        }
示例#7
0
        private IEntityChangeInformation ProcessMemberExpression(MemberExpression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
        {
            var member             = expression.Member;
            var memberName         = member.Name;
            var expressionToString = expression.ToString();

            if (processedProperties.Contains(expressionToString))
            {
                return(entityChangeContainer);
            }

            if (expression.Expression.NodeType == ExpressionType.MemberAccess)
            {
                entityChangeContainer = ProcessMemberExpression((MemberExpression)expression.Expression, entityChangeContainer, processedProperties);
            }

            if (!entityChangeContainer.Member.EndsWith("." + memberName))
            {
                entityChangeContainer.Member += "." + memberName;
            }

            processedProperties.Add(expressionToString);

            return(entityChangeContainer);
        }
示例#8
0
 private IEntityChangeInformation ProcessConstantExpression(ConstantExpression expression, IEntityChangeInformation entityChangeContainer)
 {
     entityChangeContainer.Values = entityChangeContainer.Values.Concat(new[] { expression.Value });
     return(entityChangeContainer);
 }
示例#9
0
 private IEntityChangeInformation ProcessConvertExpression(UnaryExpression expression, IEntityChangeInformation entityChangeContainer, HashSet <string> processedProperties)
 {
     return(ProcessExpression(expression.Operand, entityChangeContainer, processedProperties));
 }