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