Esempio n. 1
0
        private Expression FindConstructor(ConstructorInfo[] constructors, List <PropertyInfo> inputProperties, string prefix)
        {
            for (int i = 0; i < constructors.Length; i++)
            {
                var ctor = constructors[i];
                if (_processedConstructors.ContainsKey(ctor))
                {
                    return(_processedConstructors[ctor]);
                }

                var parameters = ctor.GetParameters();
                var arguments  = new List <Expression>();

                foreach (var parameter in parameters)
                {
                    var name = prefix + parameter.Name;

                    if (parameter.ParameterType.IsPointer)
                    {
                        continue;
                    }

                    var resolution = _provider.CurrentJob.GetResolutions().FirstOrDefault(p => p.Key.Member.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
                    if (resolution.Key != null)
                    {
                        RegisterProcessedMember(parameter.Name, prefix);
                        arguments.Add(resolution.Value);
                        continue;
                    }

                    var prop = inputProperties.Find(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase));

                    if (_config != null && _config.Resolve(name, _input, out Expression result, StringComparer.OrdinalIgnoreCase))
                    {
                        RegisterProcessedMember(parameter.Name, prefix);
                        arguments.Add(result);
                        continue;
                    }

                    if (prop == null)
                    {
                        result = Resolve(_input, Expression.Default(parameter.ParameterType), prefix + parameter.Name);
                        if (result != null)
                        {
                            RegisterProcessedMember(parameter.Name, prefix);
                            arguments.Add(result);
                        }

                        continue;
                    }

                    foreach (var resolver in _provider.GetResolvers())
                    {
                        result = resolver.Resolve(Expression.Property(_input, prop.Name), Expression.Default(parameter.ParameterType));
                        if (result != null)
                        {
                            RegisterProcessedMember(parameter.Name, prefix);
                            arguments.Add(result);
                            break;
                        }
                    }
                }

                if (arguments.Count == parameters.Length)
                {
                    var ctorExpr = Expression.New(ctor, arguments);
                    _processedConstructors.Add(ctor, ctorExpr);
                    return(ctorExpr);
                }
            }

            return(null);
        }