Ejemplo n.º 1
0
        private BaseControl LoadControl(ControlData controlData, ContentProcessorContext context)
        {
            ControlMetadata meta;

            if (_metaData.TryGetValue(controlData.Name, out meta))
            {
                if (meta.MaxChildren >= 0 && meta.MaxChildren < controlData.Children.Count)
                {
                    throw new Exception(string.Format("{0} can only have {1} children.", meta.Name, meta.MaxChildren));
                }

                BaseControl control = (BaseControl)Activator.CreateInstance(meta.Type);

                foreach (var param in meta.Parameters)
                {
                    string attrib = "";
                    object val    = null;
                    if (controlData.Attributes.TryGetValue(param.XMLName, out attrib))
                    {
                        val = attribImporter.Parse(string.IsNullOrWhiteSpace(param.ImporterOverride) ? param.DataType.Name : param.ImporterOverride, attrib, !param.Optional, context);
                    }
                    else if (!param.Optional)
                    {
                        throw new Exception("Required attribute \'" + param.XMLName + "\' was not found in the XML for the \'" + meta.Name + "\' control.");
                    }
                    else
                    {
                        val = GetDefault(param.DataType);
                    }

                    if (param.IsProperty)
                    {
                        param.PropInfo.SetValue(control, val, null);
                    }
                    else
                    {
                        param.FieldInfo.SetValue(control, val);
                    }
                }

                foreach (var child in controlData.Children)
                {
                    control.AddChild(LoadControl(child, context));
                }

                return(control);
            }
            else
            {
                throw new Exception(string.Format("Control \"{0}\" does not exist.", controlData.Name));
            }
        }