// 通过ab来设置值 public void MergeFrom(ref object value, Nested.AnyBase ab) { if (ab.valueType == 0) { value = null; return; } var dic = (IDictionary)value; if (value == null) { value = System.Activator.CreateInstance(type); dic = (IDictionary)value; } int cnt = ab.listCount; for (int i = 0; i < cnt; ++i) { if (ab.Get($"key:{i}", out var keyValue)) { object key = IL.Help.Create(keyType); keyTypeSerialize.MergeFrom(ref key, keyValue); if (ab.Get($"value:{i}", out var valueValue)) { object kv = IL.Help.Create(valueType); valueTypeSerialize.MergeFrom(ref kv, valueValue); dic[key] = kv; } else { Debug.LogError($"dic {ab.dataKey} {i} value not find value!"); } } else { Debug.LogError($"dic {ab.dataKey} {i} not find value!"); } } }
void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab) { byte flag = ab.valueType; if (flag == 0) { value = null; return; } if (value == null) { value = IL.Help.Create(type); } if (flag == 2) { return; } int cnt = fieldInfos.Count; FieldInfo field; ITypeSerialize its; for (int i = 0; i < cnt; ++i) { field = fieldInfos[i]; if (ab.Get(field.Name, out var fieldValue)) { object cv = field.GetValue(value); { its = BinarySerializable.GetByFieldInfo(field); if (fieldValue.typeFlags == its.typeFlag) { its.MergeFrom(ref cv, fieldValue); if (its.typeFlag == TypeFlags.unityObjectType) { cv = UnityObjectSerialize.To((UnityEngine.Object)cv, field.FieldType); } field.SetValue(value, cv); } } } } }
// 通过ab来设置值 void ITypeSerialize.MergeFrom(ref object value, Nested.AnyBase ab) { byte flag = ab.valueType; if (flag == 0) { value = null; return; } bool isTypeTrue = ab.elementTypeFlags == elementTypeSerialize.typeFlag; // 类型是否一致 var array = value as IList; int length = ab.listCount; if (isTypeTrue && (array == null || array.Count != length)) { array = Create(length); value = array; } if (isTypeTrue) { for (int i = 0; i < length; ++i) { object v = array[i]; ab.Get($"[{i}]", out var vv); elementTypeSerialize.MergeFrom(ref v, vv); try { array[i] = v; } catch (System.Exception /*ex*/) { } } } }