public static void SetProperties()

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);
                        }
                    }
                }
            }
        }