private static TreeViewItem GetTreeViewItem(ToolBagPrintData baseData) { TreeViewItem item = new TreeViewItem(0, -1, "Root"); List <TreeViewItem> itemList = GetChildItems(1, baseData.childDataList); if (itemList != null) { itemList.ForEach(x => item.AddChild(x)); } return(item); }
public static void SetData(ToolBagPrintData data) { if (treeViewState == null) { treeViewState = new TreeViewState(); } if (data == null) { return; } IList <int> expandIdList = null; if (treeView != null) { expandIdList = treeView.GetExpanded(); } treeView = new ToolBagDataPrintTree(treeViewState); id = 0; treeView.root.AddChild(GetTreeViewItem(data)); treeView.Reload(); if (expandIdList != null) { if (needExpand && useOldExpand) { for (int i = 0; i < expandIdList.Count; i++) { treeView.SetExpanded(expandIdList[i], true); } } else { for (int i = 0; i < expandIdList.Count; i++) { treeView.SetExpanded(expandIdList[i], false); } } } }
public static ToolBagPrintData PrintData(object obj) { objList.Clear(); System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); // 性能监测开始 if (obj == null) { return null; } ToolBagPrintData baseData = new ToolBagPrintData(); RecursionPrintData(baseData, obj); stopwatch.Stop(); Debug.Log("print data success time is " + stopwatch.Elapsed.TotalMilliseconds + "ms"); objList.Clear(); return baseData; }
private static void RecursionPrintData(ToolBagPrintData parentData, object obj, string name = null) { if (obj != null) { int index = objList.FindIndex(x => x.Equals(obj)); if (index != -1) { ToolBagPrintData data = new ToolBagPrintData(); data.name = name == null ? obj.GetType().Name : name; data.content = obj.ToString(); parentData.childDataList.Add(data); return; } objList.Add(obj); } ToolBagPrintData childData = new ToolBagPrintData(); childData.name = name == null ? obj.GetType().ToString() : name; if (obj is string str) { childData.content = str; } else if (obj.GetType().IsArray) { Array array = obj as Array; for (int i = 0; i < array.Length; i++) { RecursionPrintData(childData, array.GetValue(i)); } } else if (obj is IList iList) { for (int i = 0; i < iList.Count; i++) { RecursionPrintData(childData, iList[i]); } } else if (obj.GetType().IsEnum) { childData.content = obj.ToString(); } else if (obj is Vector3 || obj is Vector4 || obj is Vector2 || obj is Quaternion) { childData.content = obj.ToString(); } else if (obj is IDictionary iDic) { ToolBagPrintData keyData = new ToolBagPrintData(); keyData.name = "keys"; foreach (object key in iDic.Keys) { RecursionPrintData(keyData, key, key.GetType().ToString()); } ToolBagPrintData valueData = new ToolBagPrintData(); valueData.name = "value"; foreach (object value in iDic.Values) { RecursionPrintData(valueData, value, value.GetType().ToString()); } childData.childDataList.Add(keyData); childData.childDataList.Add(valueData); } else { List<FieldInfo> infos = obj.GetType().GetRuntimeFields().ToList(); infos.Sort((a, b) => String.Compare(a.Name, b.Name, StringComparison.Ordinal)); if (infos.Count == 0) { childData.content = obj.ToString(); } else { for (int i = 0; i < infos.Count; i++) { RecursionPropertyInfo(infos[i], obj, childData); } } MonoBehaviour[] components = null; if (obj is Transform childTran) { components = childTran.GetComponents<MonoBehaviour>(); } else if (obj is GameObject gameObject) { components = gameObject.GetComponents<MonoBehaviour>(); } if (components != null) { for (int i = 0; i < components.Length; i++) { RecursionPrintData(childData, components[i], "Mono_" + components[i].GetType()); } } if (obj is MonoBehaviour) { FieldInfo[] fileInfos = obj.GetType().GetFields(); for (int i = 0; i < fileInfos.Length; i++) { try { object o = fileInfos[i].GetValue(obj); if (o == null || (o is GameObject gameObj && gameObj.GetInstanceID() == 0)) { ToolBagPrintData data = new ToolBagPrintData(); data.name = fileInfos[i].Name; data.content = "Null"; childData.childDataList.Add(data); } else { RecursionPrintData(childData, o, fileInfos[i].Name); } }