/// <summary>
        /// Retourne la valeur de cette sous expression.
        /// </summary>
        /// <returns></returns>
        public object GetValue(Context context)
        {
            var    first = Parts.First();
            object obj   = first.GetObjectUnboundValue(context);

            if (Parts.Count > 1)
            {
                for (int i = 1; i < Parts.Count; i++)
                {
                    SubExpressionPart part = Parts[i];
                    obj = part.GetObjectBoundValue(context, obj);
                }
            }
            return(obj);
        }
        /// <summary>
        /// Modifie la valeur de cette sous expression.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="value"></param>
        public void SetValue(Context context, dynamic value)
        {
            var first = Parts.First();

            // Vérifions que la dernière partie est accessible en écriture.
            if (Parts.Last().IsSettable)
            {
                if (Parts.Count > 2)
                {
                    object obj = first.GetObjectUnboundValue(context);
                    int    i;
                    for (i = 1; i < Parts.Count - 1; i++)
                    {
                        SubExpressionPart part = Parts[i];
                        obj = part.GetObjectBoundValue(context, obj);
                    }
                    Parts[i].SetObjectBoundValue(context, obj, value);
                }
                else if (Parts.Count == 2)
                {
                    // Optimisation "force brute"
                    object obj = first.GetObjectUnboundValue(context);
                    Parts[1].SetObjectBoundValue(context, obj, value);
                }
                else if (Parts.Count == 1)
                {
                    // On modifie une valeur du contexte.
                    first.SetObjectUnboundValue(context, value);
                }
            }
            else
            {
                throw new InterpreterException(String.Format("L'expression {0}, n'est pas accessible en écriture",
                                                             Parts.Last().ToString()));
            }
        }