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