in src/Util/IntrospectionSupport.cs [56:125]
public static void SetProperties(object target, StringDictionary map, string prefix)
{
Tracer.DebugFormat("SetProperties called with target: {0}, and prefix: {1}",
target.GetType().Name, prefix);
foreach(string key in map.Keys)
{
if(key.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase))
{
string propertyName = key.Substring(prefix.Length);
// Process all member assignments at this level before processing
// any deeper member assignments.
if(!propertyName.Contains("."))
{
MemberInfo member = FindPropertyInfo(target, propertyName);
if(member == null)
{
throw new NMSException(string.Format("No such property or field: {0} on class: {1}", propertyName, target.GetType().Name));
}
try
{
if(member.MemberType == MemberTypes.Property)
{
PropertyInfo property = member as PropertyInfo;
property.SetValue(target, Convert.ChangeType(map[key], property.PropertyType, CultureInfo.InvariantCulture), null);
}
else
{
FieldInfo field = member as FieldInfo;
field.SetValue(target, Convert.ChangeType(map[key], field.FieldType, CultureInfo.InvariantCulture));
}
}
catch(Exception ex)
{
throw NMSExceptionSupport.Create("Error while attempting to apply option.", ex);
}
}
}
}
IList<string> propertiesSet = new List<string>();
// Now process any compound assignments, ensuring that once we recurse into an
// object we don't do it again as there could be multiple compunds element assignments
// and they'd have already been processed recursively.
foreach(string key in map.Keys)
{
if(key.StartsWith(prefix, StringComparison.InvariantCultureIgnoreCase))
{
string propertyName = key.Substring(prefix.Length);
if(propertyName.Contains("."))
{
string newTargetName = propertyName.Substring(0, propertyName.IndexOf('.'));
string newPrefix = prefix + newTargetName + ".";
if(!propertiesSet.Contains(newPrefix))
{
MemberInfo member = FindPropertyInfo(target, newTargetName);
object newTarget = GetUnderlyingObject(member, target);
SetProperties(newTarget, map, newPrefix);
propertiesSet.Add(newPrefix);
}
}
}
}
}