private static object NamedItemAPI <T>(dynamic requestObj, NamedItemCollection <T> collection, Action saveCollection = null) where T : NamedItem, new() { if (saveCollection == null) { saveCollection = (Action)(() => { ServiceWrapper.config.Save(); }); } string cmd = requestObj.cmd; int idxUnderscore = cmd.LastIndexOf('_'); if (idxUnderscore > -1 && idxUnderscore + 1 < cmd.Length) { cmd = cmd.Substring(idxUnderscore + 1); } switch (cmd) { case "reorder": { return(new ResultWithData(collection.Reorder(requestObj.ids.ToObject <List <int> >()))); } case "names": { return(new ResultWithData(collection.Names())); } case "list": { return(new ResultWithData(collection.List())); } case "new": { object result = collection.New(); if (result != null) { saveCollection(); return(new ResultWithData(result)); } else { return(new ResultFailWithReason("unable to create new item")); } } case "get": { T item = collection.Get((int)requestObj.id); if (item != null) { return(new ResultWithData(item)); } else { return(new ResultFailWithReason("the item was not found")); } } case "update": { string itemReserialized = JsonConvert.SerializeObject(requestObj.item); T item = JsonConvert.DeserializeObject <T>(itemReserialized); if (collection.Update(item)) { saveCollection(); return(new ResultWithData(item)); } else { item = collection.Get(item.id); if (item != null) { return(new ResultFailWithData("the name was already taken", item)); } else { return(new ResultFailWithReason("the item was not found")); } } } case "delete": { collection.Delete((int)requestObj.id); saveCollection(); return(new ResultSuccess()); } default: return(null); } }