internal static void Abracadabra(object item, IParameters parameters) { var props = item.GetType() .GetProperties(BindingFlags.Instance | BindingFlags.Public) .Where(x => x.CanWrite); foreach (var prop in props) { (var name, var isRequired) = prop.GetAutoInitializeProperty(); if (!parameters.HasKey(name, out var key)) { if (isRequired) { throw new ArgumentNullException(name); } continue; } prop.SetValue(item, parameters.GetValue(key, prop.PropertyType)); } }