public void AddValue(object lastObject) { switch (Operation) { case 0: var propName = Properties[CurrentPropertyIndex++]; if (lastObject != null && TypeInfo.Properties.TryGetValue(propName, out var fPropInfo)) { var fastProp = fPropInfo.Property; var propType = fastProp.PropertyType; if (lastObject.GetType() == propType) { fastProp.SetValue(Value, lastObject); } else if (fPropInfo.IsEnum) { fastProp.SetValue(Value, Enum.ToObject(propType, lastObject)); } else { fastProp.SetValue(Value, DataTypeHelper.Change(lastObject, fPropInfo.UnderlyingType)); } } CurrentType = CurrentPropertyIndex < PropertiesLength ? PropertiesType[CurrentPropertyIndex] : Type; break; case 1: if (TypeInfo.IsArray) { ListValue[ListIndex++] = DataTypeHelper.Change(lastObject, TypeInfo.InnerTypes[0]); } else { ListValue.Add(DataTypeHelper.Change(lastObject, TypeInfo.InnerTypes[0])); } break; case 2: if (ItemDictionaryIdx == 0) { _tmpDictionary = lastObject; ItemDictionaryIdx++; CurrentType = TypeInfo.InnerTypes[1]; } else { var dKey = DataTypeHelper.Change(_tmpDictionary, TypeInfo.InnerTypes[0]); var dValue = DataTypeHelper.Change(lastObject, TypeInfo.InnerTypes[1]); DictionaryValue.Add(dKey, dValue); _tmpDictionary = null; ItemDictionaryIdx = 0; CurrentType = TypeInfo.InnerTypes[0]; } break; } }
private static object GetValue(object item, Type underType) { var value = item; if (item is DynamicDeserializedType ddtValue) { value = Activator.CreateInstance(ddtValue.ValueType != null ? Core.GetType(ddtValue.ValueType) : underType); ddtValue.BindObject(ref value); } value = DataTypeHelper.Change(value, underType); return(value); }