Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
        }