/// <summary> /// Uses the supplied <see cref="IParserContext"/> to write all values to properties. /// </summary> /// <param name="parserContext">The supplied <see cref="IParserContext"/>.</param> /// <exception cref="ArgumentNullException">The value of '<paramref name="parserContext"/>' cannot be null. </exception> /// <exception cref="PropertyMustBeSpecifiedException">The 'ValueProcessor' property of one of the parameters inside the <see cref="IParserContext"/> is null.</exception> public void Parse(IParserContext parserContext) { if (parserContext == null) { throw new ArgumentNullException(nameof(parserContext)); } foreach (var propertyMapping in parserContext.Maps.Join(parserContext.QueryValuePairs, map => map.Parameter.ParameterName, pair => pair.Key, (map, pair) => { map.Parameter.Value = pair.Value.Value; return(map); })) { if (propertyMapping.Parameter.ValueProcessor == null) { throw new PropertyMustBeSpecifiedException("ValueProcessor", propertyMapping.Parameter); } if (propertyMapping.Parameter.Value == null) { throw new PropertyMustBeSpecifiedException("Value", propertyMapping.Parameter); } if (propertyMapping.Parameter.TypeOfValue == null) { throw new PropertyMustBeSpecifiedException("TypeOfValue", propertyMapping.Parameter); } var childProcessingContext = parserContext.CreateProcessingContext(propertyMapping.Parameter.Value.ToString(), propertyMapping.Parameter.TypeOfValue); var resolvedValue = propertyMapping.Parameter.ValueProcessor.Resolve(childProcessingContext); propertyMapping.Property.SetValue(propertyMapping.Source, resolvedValue); } }