public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) { result = null; switch (binder.Name) { case "IsCollection": { result = this.Elements.Count() > 0; return(true); } case "GetProperties": { result = this.propertiesSource.GetProperties(); return(true); } case "GetPropertiesWith": { if (args.Length == 2 && args[0].GetType() == typeof(String) && args[1].GetType() == typeof(String)) { result = this.propertiesSource.GetProperties(args[0].ToString(), args[1].ToString()); return(true); } break; } case "GetExtendedPropertyValue": { if (args.Length == 2 && args[0].GetType() == typeof(String) && //Property Name args[1].GetType() == typeof(String)) //Extended Property Name { result = this.propertiesSource.GetExtendedPropertyValue(args[0].ToString(), args[1].ToString()); return(true); } break; } case "SetExtendedPropertyValue": { if (args.Length == 3 && args[0].GetType() == typeof(String) && //Property Name args[1].GetType() == typeof(String) && //Extended Property Name args[2].GetType() == typeof(String)) //Extended Property Value { result = true; this.propertiesSource.SetExtendedPropertyValue(args[0].ToString(), args[1].ToString(), args[2].ToString()); return(true); } break; } case "Import": { //Check parameters if (args.Length == 2 && args[0].GetType() == typeof(ConfigElement) && args[1].GetType() == typeof(String)) { var element = Elements.Import(args[0] as ConfigElement, args[1].ToString()); element.Id = args[1].ToString(); cachedElements.Add(args[1].ToString(), element); result = element; return(true); } break; } case "Add": { //Check parameters if (args.Length == 1 && args[0].GetType() == typeof(String)) { var element = Elements.Add(args[0].ToString()); element.Id = args[0].ToString(); cachedElements.Add(args[0].ToString(), element); result = element; if (CollectionChanged != null) { CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, result)); } return(true); } break; } case "Append": { //Assumes we are appending to a collection. if (args.Length == 2 && args[0].GetType() == typeof(String) && args[1].GetType() == typeof(ConfigElement) && !string.IsNullOrEmpty(GetProperty("CollectionOf"))) { var element = args[1] as ConfigElement; Elements.Append(args[0].ToString(), element); element.Id = args[0].ToString(); cachedElements.Add(args[0].ToString(), element); result = element; if (CollectionChanged != null) { CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, result)); } return(true); } break; } case "AddCollection": { //Check parameters if (args.Length == 2 && args[0].GetType() == typeof(String) && args[1].GetType() == typeof(String) && string.IsNullOrEmpty(CollectionOf)) //Dont want to add to a collection level element { var collection = Elements.AddCollection(args[0].ToString(), args[1].ToString()); collection.Id = args[0].ToString(); cachedElements.Add(args[0].ToString(), collection); result = collection; return(true); } break; } case "Remove": { //Check parameters if (args.Length == 1 && args[0].GetType() == typeof(String)) { result = Elements.Remove(args[0].ToString()); if (cachedElements.ContainsKey(args[0].ToString())) { cachedElements.Remove(args[0].ToString()); } if (CollectionChanged != null) { CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } return(true); } break; } case "RemoveCollection": { //Check parameters if (args.Length == 1 && args[0].GetType() == typeof(String) && string.IsNullOrEmpty(CollectionOf)) //Dont want to add to a collection level element { if (cachedElements.ContainsKey(args[0].ToString())) { cachedElements.Remove(args[0].ToString()); } result = Elements.RemoveCollection(args[0].ToString()); return(true); } break; } } return(false); }