/// <summary> /// 遍历指定物体节点下的所有UIProgramData,然后根据字段名反射赋值 /// </summary> /// <param name="rootObj">物体根节点</param> /// <param name="uiData">UIData对象</param> public static void ForEachDataByAttribute(GameObject rootObj, object uiData) { dataList.Clear(); if (rootObj == null || uiData == null) { return; } UIProgramData[] allData = rootObj.GetComponentsInChildren <UIProgramData>(true); if (null == allData || allData.Length == 0) { return; } for (int iLoop = 0; iLoop < allData.Length; iLoop++) { UIProgramData programData = allData[iLoop]; if (null != programData.ExportData && programData.ExportData.Length > 0) { for (int iIndex = 0; iIndex < programData.ExportData.Length; iIndex++) { UIExportData exportData = programData.ExportData[iIndex]; dataList.Add(exportData); } } } System.Reflection.FieldInfo[] fieldInfoArr = uiData.GetType().GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public); foreach (var field in fieldInfoArr) { object[] objAtts = field.GetCustomAttributes(typeof(UIDataAttribute), false); if (objAtts != null && objAtts.Length > 0) { for (int j = 0, jMax = objAtts.Length; j < jMax; j++) { if (objAtts[j] == null) { continue; } UIDataAttribute dataAtt = objAtts[j] as UIDataAttribute; SetFieldValue(uiData, field, dataAtt); } } } }
private static void SetFieldValue(object uiData, System.Reflection.FieldInfo field, UIDataAttribute dataAtt) { for (int x = 0, xMax = dataList.Count; x < xMax; x++) { UIExportData exportData = dataList[x]; if (exportData != null && exportData.VariableName.Equals(dataAtt.FieldName)) { if (exportData.isArrayData) { System.Array dataArr = null; if (exportData.isGameObjectRef) { dataArr = System.Array.CreateInstance(typeof(GameObject), exportData.CompReferenceArray.Length); } else { dataArr = System.Array.CreateInstance(exportData.CompReferenceArray[0].GetType(), exportData.CompReferenceArray.Length); } for (int y = 0; y < exportData.CompReferenceArray.Length; y++) { if (exportData.isGameObjectRef) { dataArr.SetValue(exportData.CompReferenceArray[y].gameObject, y); } else { dataArr.SetValue(exportData.CompReferenceArray[y], y); } } field.SetValue(uiData, dataArr); } else { if (exportData.isGameObjectRef) { field.SetValue(uiData, exportData.CompReference.gameObject); } else { field.SetValue(uiData, exportData.CompReference); } } dataList[x] = null; break; } } }