/// <summary>
        /// Gets the type of the section object.
        /// </summary>
        /// <param name="config"></param>
        /// <param name="sectionName"></param>
        /// <returns></returns>
        private Type GetConfigSectionObjectType(object config, string sectionName)
        {
            Type sectionType = null;
            Type type        = config.GetType();

            PropertyInfo[] objProps = type.GetProperties();

            if (objProps != null)
            {
                for (int i = 0; i < objProps.Length; i++)
                {
                    PropertyInfo propInfo      = objProps[i];
                    Object[]     customAttribs = propInfo.GetCustomAttributes(typeof(ConfigurationSectionAttribute), false);
                    if (customAttribs != null && customAttribs.Length > 0)
                    {
                        ConfigurationSectionAttribute configSection = customAttribs[0] as ConfigurationSectionAttribute;
                        if (configSection != null && String.Compare(configSection.SectionName, sectionName, true) == 0)
                        {
                            sectionType = propInfo.PropertyType;
                            break;
                        }
                    }
                }
            }

            if (sectionType == null)
            {
                if (_dynamicSectionTypeMap.ContainsKey(sectionName.ToLower()))
                {
                    sectionType = _dynamicSectionTypeMap[sectionName.ToLower()].Type;
                }
            }

            return(sectionType);
        }
        private void SetConfigSectionObject(object config, object sectionConfig, string sectionName)
        {
            Type type = config.GetType();

            PropertyInfo[] objProps = type.GetProperties();
            try
            {
                if (objProps != null)
                {
                    for (int i = 0; i < objProps.Length; i++)
                    {
                        PropertyInfo propInfo      = objProps[i];
                        Object[]     customAttribs = propInfo.GetCustomAttributes(typeof(ConfigurationSectionAttribute), false);

                        if (customAttribs != null && customAttribs.Length > 0)
                        {
                            ConfigurationSectionAttribute configSection = customAttribs[0] as ConfigurationSectionAttribute;
                            try
                            {
                                if (configSection != null && String.Compare(configSection.SectionName, sectionName, true) == 0)
                                {
                                    propInfo.SetValue(config, sectionConfig, null);
                                }
                            }
                            catch (Exception e)
                            {
                                throw new Runtime.Exceptions.ConfigurationException("Duplicate cache entries in " + config);
                            }
                        }


                        customAttribs = propInfo.GetCustomAttributes(typeof(DynamicConfigurationSectionAttribute), false);
                        if (customAttribs != null && customAttribs.Length > 0)
                        {
                            DynamicConfigurationSectionAttribute configSection = customAttribs[0] as DynamicConfigurationSectionAttribute;
                            try
                            {
                                if (configSection != null && String.Compare(configSection.SectionName, sectionName, true) == 0)
                                {
                                    propInfo.SetValue(config, sectionConfig, null);
                                }
                            }
                            catch (Exception e)
                            {
                                throw new Runtime.Exceptions.ConfigurationException("Duplicate cache entries in " + config);
                            }
                        }
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
        private Object GetConfigSectionObject(object config, string sectionName)
        {
            Type type = config.GetType();

            PropertyInfo[] objProps = type.GetProperties();

            if (objProps != null)
            {
                for (int i = 0; i < objProps.Length; i++)
                {
                    PropertyInfo propInfo      = objProps[i];
                    Object[]     customAttribs = propInfo.GetCustomAttributes(typeof(ConfigurationSectionAttribute), false);
                    if (customAttribs != null && customAttribs.Length > 0)
                    {
                        ConfigurationSectionAttribute configSection = customAttribs[0] as ConfigurationSectionAttribute;
                        if (configSection != null && String.Compare(configSection.SectionName, sectionName, true) == 0)
                        {
                            return(Activator.CreateInstance(propInfo.PropertyType));
                        }
                    }
                }
            }
            return(null);
        }
        private string GetSectionXml(Object configSection, string sectionName, int indent)
        {
            string endStr = "\r\n";
            string preStr = "".PadRight(indent * 2);

            StringBuilder sb   = new StringBuilder(preStr + "<" + sectionName);
            Type          type = configSection.GetType();

            PropertyInfo[] propertiesInfo = type.GetProperties();

            if (propertiesInfo != null && propertiesInfo.Length > 0)
            {
                for (int i = 0; i < propertiesInfo.Length; i++)
                {
                    PropertyInfo property      = propertiesInfo[i];
                    object[]     customAttribs = property.GetCustomAttributes(true);

                    if (customAttribs != null && customAttribs.Length > 0)
                    {
                        for (int j = 0; j < customAttribs.Length; j++)
                        {
                            ConfigurationAttributeAttribute attrib = customAttribs[j] as ConfigurationAttributeAttribute;
                            if (attrib != null)
                            {
                                Object propertyValue = property.GetValue(configSection, null);
                                string appendedText  = attrib.AppendedText != null ? attrib.AppendedText : "";
                                if (propertyValue != null)
                                {
                                    sb.Append(" " + attrib.AttributeName + "=\"" + propertyValue.ToString() + appendedText + "\"");
                                }
                                else
                                {
                                    sb.Append(" " + attrib.AttributeName + "=\"\"");
                                }
                            }
                        }
                    }
                }
            }
            bool          subsectionsFound = false;
            bool          firstSubSection  = true;
            StringBuilder comments         = null;

            //get xml string for sub-sections if exists
            if (propertiesInfo != null && propertiesInfo.Length > 0)
            {
                for (int i = 0; i < propertiesInfo.Length; i++)
                {
                    PropertyInfo property      = propertiesInfo[i];
                    object[]     customAttribs = property.GetCustomAttributes(true);

                    if (customAttribs != null && customAttribs.Length > 0)
                    {
                        for (int j = 0; j < customAttribs.Length; j++)
                        {
                            ConfigurationCommentAttribute commentAttrib = customAttribs[j] as ConfigurationCommentAttribute;
                            if (commentAttrib != null)
                            {
                                Object propertyValue = property.GetValue(configSection, null);
                                if (propertyValue != null)
                                {
                                    string propStr = propertyValue as string;
                                    if (!string.IsNullOrEmpty(propStr))
                                    {
                                        if (comments == null)
                                        {
                                            comments = new StringBuilder();
                                        }
                                        comments.AppendFormat("{0}<!--{1}-->{2}", preStr, propStr, endStr);
                                    }
                                }
                            }

                            ConfigurationSectionAttribute attrib = customAttribs[j] as ConfigurationSectionAttribute;
                            if (attrib != null)
                            {
                                Object propertyValue = property.GetValue(configSection, null);
                                if (propertyValue != null)
                                {
                                    subsectionsFound = true;
                                    if (firstSubSection)
                                    {
                                        sb.Append(">" + endStr);
                                        firstSubSection = false;
                                    }
                                    if (propertyValue.GetType().IsArray)
                                    {
                                        Array  array = propertyValue as Array;
                                        Object actualSectionObj;
                                        for (int k = 0; k < array.Length; k++)
                                        {
                                            actualSectionObj = array.GetValue(k);
                                            if (actualSectionObj != null)
                                            {
                                                sb.Append(GetSectionXml(actualSectionObj, attrib.SectionName, indent + 1));
                                            }
                                        }
                                    }
                                    else
                                    {
                                        sb.Append(GetSectionXml(propertyValue, attrib.SectionName, indent + 1));
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (subsectionsFound)
            {
                sb.Append(preStr + "</" + sectionName + ">" + endStr);
            }
            else
            {
                sb.Append("/>" + endStr);
            }

            string xml = string.Empty;

            if (comments != null)
            {
                xml = comments.ToString() + sb.ToString();
            }
            else
            {
                xml = sb.ToString();
            }

            return(xml);
        }