/// <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())); } }