예제 #1
0
        private static Expression?CustomResolverFn(Expression source, IMemberModel destinationMember, CompileArgument arg)
        {
            var config    = arg.Settings;
            var resolvers = config.Resolvers;

            if (resolvers == null || resolvers.Count <= 0)
            {
                return(null);
            }

            var invokes = new List <Tuple <Expression, Expression> >();

            Expression?getter = null;

            foreach (var resolver in resolvers)
            {
                if (!destinationMember.Name.Equals(resolver.DestinationMemberName))
                {
                    continue;
                }
                var invoke = resolver.Invoker == null
                    ? ExpressionEx.PropertyOrField(source, resolver.SourceMemberName)
                    : resolver.IsChildPath
                    ? resolver.Invoker.Body
                    : resolver.Invoker.Apply(arg.MapType, source);

                if (resolver.Condition == null)
                {
                    getter = invoke;
                    break;
                }

                var condition = resolver.IsChildPath
                    ? resolver.Condition.Body
                    : resolver.Condition.Apply(arg.MapType, source);
                invokes.Add(Tuple.Create(condition, invoke));
            }

            if (invokes.Count > 0)
            {
                invokes.Reverse();
                if (getter == null)
                {
                    var type = invokes[0].Item2.Type;
                    getter = type.CreateDefault();
                }
                foreach (var invoke in invokes)
                {
                    getter = Expression.Condition(invoke.Item1, invoke.Item2, getter);
                }
            }

            return(getter);
        }
예제 #2
0
        public InvokerModel?Next(ParameterExpression source, string destMemberName)
        {
            if (!this.DestinationMemberName.StartsWith(destMemberName + "."))
            {
                return(null);
            }

            return(new InvokerModel
            {
                DestinationMemberName = this.DestinationMemberName.Substring(destMemberName.Length + 1),
                Condition = this.IsChildPath || this.Condition == null
                    ? this.Condition
                    : Expression.Lambda(this.Condition.Apply(source), source),
                Invoker = this.IsChildPath
                    ? this.Invoker
                    : Expression.Lambda(this.Invoker?.Apply(source) ?? ExpressionEx.PropertyOrField(source, this.SourceMemberName), source),
                SourceMemberName = this.SourceMemberName,
                IsChildPath = true,
            });
        }