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