/// <summary> /// Resolve a dot-notation reference to values in this object /// </summary> /// <param name="expression"></param> /// <returns></returns> public object ResolveExpressionValue(string expression) { if (string.IsNullOrEmpty(expression)) { return(null); } //look for reserved values: if (expression == "length") { return(Length); } if (IsArray) { string ndx, after = null; if (expression.StartsWith("[")) { int bend = expression.IndexOf("]"); if (bend == -1) { throw new ArgumentException("Bad resolver expression in JSON: " + expression); } ndx = expression.Substring(1, bend - 1); if (!expression.EndsWith("]")) { if (expression.Substring(bend + 1, 1) == ".") { after = expression.Substring(bend + 2); } else { after = expression.Substring(bend + 1); } } } else { ndx = expression; } int pos; object item = null; if (Int32.TryParse(ndx, out pos)) { if (pos > -1 && DataList.Count > pos) { item = DataList[pos]; } } //and @attrib values else if (ndx.StartsWith("@")) { string attrib; string val; if (ParseSelectorString(ndx, out attrib, out val)) { //cycle array for (int i = 0; i < DataList.Count; i++) { if (DataList[i] is IExpressionEvaluator) { IExpressionEvaluator evalObj = DataList[i] as IExpressionEvaluator; object actualVal = evalObj.ResolveExpressionValue(attrib); if (!string.IsNullOrEmpty(val) && val.Equals(actualVal)) { item = evalObj; break; } } } } } if (string.IsNullOrEmpty(after)) { return(item); } else if (item is IExpressionEvaluator) { return(((IExpressionEvaluator)item).ResolveExpressionValue(after)); } } else { string key = ExtractJSONKey(expression); if (string.IsNullOrEmpty(key)) { return(null); } if (DataDictionary.ContainsKey(key)) { return(DataDictionary[key]); } else { int dotPos = key.IndexOf("."); int bracketPos = key.IndexOf("["); if (dotPos == -1 && bracketPos == -1) { return(null); } bool isDot = false; bool isIndex = false; if (dotPos > -1 && bracketPos > -1) { if (dotPos < bracketPos) { isDot = true; } else { isIndex = true; } } else if (dotPos > -1) { isDot = true; } else if (bracketPos > -1) { isIndex = true; } if (isDot) { string first = key.Substring(0, dotPos); string theRest = key.Substring(dotPos + 1); if (DataDictionary.ContainsKey(first)) { object val = DataDictionary[first]; if (val is IExpressionEvaluator) { return(((IExpressionEvaluator)val).ResolveExpressionValue(theRest)); } else { return(null); } } else { return(null); } } else if (isIndex) { string first = key.Substring(0, bracketPos); string theRest = key.Substring(bracketPos); if (theRest.EndsWith("]") && theRest.StartsWith("[")) { theRest = theRest.Substring(1, theRest.Length - 2); } if (DataDictionary.ContainsKey(first)) { object val = DataDictionary[first]; if (val is IExpressionEvaluator) { return(((IExpressionEvaluator)val).ResolveExpressionValue(theRest)); } else { return(null); } } else { return(null); } } else { return(null); } } } return(null); }