private ConstructedValueExpression GetConstructorCallExpression(MapTypeContext context, ISpecificTypeSettings specificTypeSettings, ParameterExpression instanceVar) { var expressions = new List <Expression>(); var variables = new List <ParameterExpression>(); var constructor = context.GetConstructor(specificTypeSettings); var parameters = constructor.GetParameters(); var args = new Expression[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { var parameter = parameters[i]; var name = parameter.Name.ToLowerInvariant(); var substate = context.GetSubstateForProperty(name, parameter, parameter.ParameterType); // Compile an expression to get a value for this argument. If we don't have, it, // get a default expression for this type. We should have it in theory, because the // constructor finder shouldn't have given us a constructor which contains // parameters we don't have values for. var expr = _values.Compile(substate); if (expr.FinalValue == null || expr.IsNothing) { args[i] = parameter.ParameterType.GetDefaultValueExpression(); continue; } args[i] = expr.FinalValue; expressions.AddRange(expr.Expressions); variables.AddRange(expr.Variables); } // Call the constructor with the given args list expressions.Add( Expression.Assign(instanceVar, Expression.New(constructor, args) ) ); return(new ConstructedValueExpression(expressions, instanceVar, variables)); }