コード例 #1
0
        /// <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);
        }