/// <summary>
        /// Deserializes a call expression where the target is an array expression.
        ///
        /// System.Array[String](["a", "b"])
        /// </summary>
        object DeserializeCreateArrayExpression(CallExpression callExpression, IndexExpression target)
        {
            ListExpression list      = callExpression.Args[0].Expression as ListExpression;
            Type           arrayType = GetType(target.Index as MemberExpression);
            Array          array     = Array.CreateInstance(arrayType, list.Items.Count);

            for (int i = 0; i < list.Items.Count; ++i)
            {
                Expression         listItemExpression     = list.Items[i];
                ConstantExpression constantExpression     = listItemExpression as ConstantExpression;
                MemberExpression   memberExpression       = listItemExpression as MemberExpression;
                NameExpression     nameExpression         = listItemExpression as NameExpression;
                CallExpression     listItemCallExpression = listItemExpression as CallExpression;
                if (constantExpression != null)
                {
                    array.SetValue(constantExpression.Value, i);
                }
                else if (memberExpression != null)
                {
                    string name = PythonControlFieldExpression.GetVariableName(memberExpression.Name);
                    array.SetValue(componentCreator.GetComponent(name), i);
                }
                else if (nameExpression != null)
                {
                    array.SetValue(componentCreator.GetInstance(nameExpression.Name), i);
                }
                else if (listItemCallExpression != null)
                {
                    Type   arrayInstanceType = GetType(listItemCallExpression.Target as MemberExpression);
                    object instance          = componentCreator.CreateInstance(arrayInstanceType, GetArguments(listItemCallExpression), null, false);
                    array.SetValue(instance, i);
                }
            }
            return(array);
        }
        /// <summary>
        /// Adds a component to the list of created objects.
        /// </summary>
        void AddComponent(string name, object obj)
        {
            IComponent component = obj as IComponent;

            if (component != null)
            {
                string variableName = PythonControlFieldExpression.GetVariableName(name);
                componentCreator.Add(component, variableName);
            }
        }
        /// <summary>
        /// Deserializes expressions of the form:
        ///
        /// 1) System.Windows.Forms.Cursors.AppStarting
        /// </summary>
        object Deserialize(MemberExpression memberExpression)
        {
            PythonControlFieldExpression field = PythonControlFieldExpression.Create(memberExpression);
            Type type = GetType(field);

            if (type != null)
            {
                if (type.IsEnum)
                {
                    return(Enum.Parse(type, field.MemberName));
                }
                else
                {
                    BindingFlags propertyBindingFlags = BindingFlags.Public | BindingFlags.GetField | BindingFlags.Static | BindingFlags.Instance;
                    PropertyInfo propertyInfo         = type.GetProperty(field.MemberName, propertyBindingFlags);
                    if (propertyInfo != null)
                    {
                        return(propertyInfo.GetValue(type, null));
                    }
                }
            }
            return(componentCreator.GetInstance(PythonControlFieldExpression.GetVariableName(field.MemberName)));
        }