private static void ArrayEnumeration(Converter.ValueActionDelegate action, Converter.ArrayAccessor accessor, int rank, object[] attributes) { Array array = accessor.array; int lowerBound = array.GetLowerBound(rank); int upperBound = array.GetUpperBound(rank); if (rank + 1 < array.Rank) { for (int index = lowerBound; index <= upperBound; ++index) { accessor.index[rank] = index; Converter.ArrayEnumeration(action, accessor, rank + 1, attributes); } } else { for (int index = lowerBound; index <= upperBound; ++index) { //Debug.Log($"ArrayEnumeration 枚举数组数据({index} / {array.Length})"); accessor.index[rank] = index; Converter.ValueAction(action, accessor, attributes); } } }
/// <summary> /// 类字段值枚举 /// </summary> /// <param name="action"></param> /// <param name="accessor"></param> private static void FieldEnumeration(Converter.ValueActionDelegate action, Converter.Accessor accessor) { Type type = accessor.type; Converter.FieldAccessor fieldAccessor = new Converter.FieldAccessor(accessor.obj); //Debug.Log($"FieldEnumeration 开始枚举{type.Name}的字段 -->"); foreach (FieldInfo field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { if (!(Attribute.GetCustomAttribute(field, typeof(NotConvertAttribute)) is NotConvertAttribute)) { fieldAccessor.SetFieldInfo(field); //if (accessor.obj != null) // Debug.Log($"{type.Name}.{field.Name} = {field.GetValue(accessor.obj)}"); Converter.ValueAction(action, fieldAccessor, field.GetCustomAttributes(false)); } } }
private static void ValueAction(Converter.ValueActionDelegate action, Converter.Accessor accessor, object[] attributes) { // 普通字段 if (action(accessor, attributes)) { return; } // 数组字段、自定义类字段 Type type = accessor.type; if (type.IsArray) { Converter.ArrayEnumeration(action, accessor, attributes); } else { if (!type.IsClass) // 不支持struct { return; } Converter.FieldEnumeration(action, accessor); } }
private static void ArrayEnumeration(Converter.ValueActionDelegate action, Converter.Accessor accessor, object[] attributes) { Converter.ArrayAccessor accessor1 = new Converter.ArrayAccessor(accessor.obj as Array); Converter.ArrayEnumeration(action, accessor1, 0, attributes); }