public bool TryMatchAndSetParameterValues(GenericObjectSerializer genericSerializer, IDictionary <string, object> propertyValues, string path) { object[] parameterValues = new object[ParameterCount]; for (int i = 0; i < ParameterCount; i++) { ParameterInfo parameterInfo = Parameters[i]; string parameterName = parameterInfo.Name.FormatPath(path); if (parameterInfo.ParameterType.IsUserClass()) { parameterValues[i] = genericSerializer.Deserialize(parameterInfo.ParameterType, propertyValues, parameterName); if (parameterValues[i] == null) { if (parameterInfo.HasDefaultValue) { parameterValues[i] = parameterInfo.DefaultValue; } else { return(false); } } } else { (bool exisits, object dataSourceValue) = propertyValues.TryGetValue(parameterName); if (exisits) { parameterValues[i] = dataSourceValue; } else if (parameterInfo.HasDefaultValue) { parameterValues[i] = parameterInfo.DefaultValue; } else { return(false); } } } ParametersValues = parameterValues; return(true); }
public static ConstructorInfoWrapper GetConstructorWithMostParametersThatCanSatisfy(this Type type, GenericObjectSerializer genericSerializer, IDictionary <string, object> propertyValues, string path) { return(type .GetConstructorsByParameterCount() .FirstOrDefault(c => c.TryMatchAndSetParameterValues(genericSerializer, propertyValues, path))); }