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