void WriteChildrenJsonData(BNode childNode, JsonData parentData) { JsonData nodeData = new JsonData(); parentData.Add(nodeData); nodeData.SetJsonType(JsonType.Object); nodeData["name"] = childNode.NodeName; nodeData["type"] = childNode.GetType().ToString(); JsonData args = new JsonData(); args.SetJsonType(JsonType.Array); nodeData["args"] = args; #region args Type type = childNode.GetType(); PropertyInfo[] ps = type.GetProperties(); PropertyInfo[] basePs = type.BaseType.GetProperties(); List <PropertyInfo> listInfo = new List <PropertyInfo>(); foreach (PropertyInfo info in ps) { bool flag = false; foreach (PropertyInfo baseinfo in basePs) { if (baseinfo.Name.Equals(info.Name)) { flag = true; } } if (flag) { continue; } listInfo.Add(info); } for (int i = 0; i < listInfo.Count; i++) { PropertyInfo info = listInfo[i]; JsonData arg = new JsonData(); arg["argname"] = info.Name; arg["argtype"] = info.PropertyType.ToString(); arg["argvalue"] = info.GetValue(childNode, null).ToString(); args.Add(arg); } #endregion JsonData childrenData = new JsonData(); childrenData.SetJsonType(JsonType.Array); nodeData["children"] = childrenData; for (int i = 0; i < childNode.ListChildren.Count; i++) { BNode child = childNode.ListChildren[i]; WriteChildrenJsonData(child, childrenData); } }
void AddChildNode(JsonData jsonData, BNode fatherNode) { //Debug.LogError("jsonData " + jsonData["name"]); Type t = Type.GetType((string)jsonData["type"]); BNode nodeChild = Activator.CreateInstance(t) as BNode; #region args JsonData args = jsonData["args"]; PropertyInfo[] pInfos = nodeChild.GetType().GetProperties(); for (int i = 0; i < args.Count; i++) { JsonData arg = args[i]; PropertyInfo pi = nodeChild.GetType().GetProperty(arg["argname"].ToString()); if (Type.GetType(arg["argtype"].ToString()).Equals(typeof(System.String))) { pi.SetValue(nodeChild, arg["argvalue"].ToString(), null); } else if (Type.GetType(arg["argtype"].ToString()).Equals(typeof(System.Single))) { pi.SetValue(nodeChild, float.Parse(arg["argvalue"].ToString()), null); } else if (Type.GetType(arg["argtype"].ToString()).Equals(typeof(System.Int32))) { pi.SetValue(nodeChild, int.Parse(arg["argvalue"].ToString()), null); } else if (Type.GetType(arg["argtype"].ToString()).BaseType.Equals(typeof(System.Enum))) { //pi.SetValue(nodeChild, int.Parse(arg["argvalue"].ToString()), null); //arg["argvalue"].ToString() //Debug.LogError("--------------------------------------ffff"); FieldInfo fiSelect = null; FieldInfo[] fields = pi.PropertyType.GetFields(BindingFlags.Static | BindingFlags.Public); for (int j = 0; j < fields.Length; j++) { FieldInfo fi = fields[j]; if (fi.Name.Equals(arg["argvalue"].ToString())) { fiSelect = fi; } } pi.SetValue(nodeChild, fiSelect.GetValue(null), null); } else if (Type.GetType(arg["argtype"].ToString()).Equals(typeof(System.Boolean))) { if (arg["argvalue"].ToString().Equals("True")) { pi.SetValue(nodeChild, true, null); } else { pi.SetValue(nodeChild, false, null); } } } #endregion fatherNode.AddChild(nodeChild); for (int i = 0; i < jsonData["children"].Count; i++) { JsonData nodeJson = jsonData["children"][i]; AddChildNode(nodeJson, nodeChild); } }