in openapi-diff/src/core/OpenApiDiff.Core/Settings.cs [156:221]
private static void PopulateSettings(object entityToPopulate, IDictionary<string, object> settings)
{
if (entityToPopulate == null)
{
throw new ArgumentNullException("entityToPopulate");
}
if (settings != null && settings.Count > 0)
{
// Setting property value from dictionary
foreach (var setting in settings.ToArray())
{
PropertyInfo property = entityToPopulate.GetType().GetProperties()
.FirstOrDefault(p => setting.Key.Equals(p.Name, StringComparison.OrdinalIgnoreCase) ||
p.GetCustomAttributes<SettingsAliasAttribute>()
.Any(a => setting.Key.Equals(a.Alias, StringComparison.OrdinalIgnoreCase)));
if (property != null)
{
try
{
if (property.PropertyType == typeof(bool) && (setting.Value == null || String.IsNullOrEmpty(setting.Value.ToString())))
{
property.SetValue(entityToPopulate, true);
}
else if (property.PropertyType.GetTypeInfo().IsEnum)
{
property.SetValue(entityToPopulate, Enum.Parse(property.PropertyType, setting.Value.ToString(), true));
}
else if (property.PropertyType.IsArray && setting.Value.GetType() == typeof(JArray))
{
var elementType = property.PropertyType.GetElementType();
if (elementType == typeof(string))
{
var stringArray = ((JArray)setting.Value).Children().
Select(
c => c.ToString())
.ToArray();
property.SetValue(entityToPopulate, stringArray);
}
else if (elementType == typeof(int))
{
var intValues = ((JArray)setting.Value).Children().
Select(c => (int)Convert.ChangeType(c, elementType, CultureInfo.InvariantCulture))
.ToArray();
property.SetValue(entityToPopulate, intValues);
}
}
else if (property.CanWrite)
{
property.SetValue(entityToPopulate,
Convert.ChangeType(setting.Value, property.PropertyType, CultureInfo.InvariantCulture), null);
}
settings.Remove(setting.Key);
}
catch (Exception exception)
{
throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, Resources.ParameterValueIsNotValid,
setting.Key, property.GetType().Name), exception);
}
}
}
}
}