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); }
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, }); }