public SetterEnumerator(Type type, JsonDictionary dict) { _setters = ReflectiveOperation.GetSetterList(type); _dict = dict; }
private static object ConvertToObject(InternalObject obj, Type type) { var stack = new Stack <Context>(); var context = new Context(); object result; Convert: if (type == typeof(object)) { result = ToValue(obj); goto Return; } switch (obj.Type) { case JsonType.Null: result = System.Convert.ChangeType(ToValue(obj), type, CultureInfo.InvariantCulture); break; case JsonType.True: case JsonType.False: result = type == typeof(bool) ? obj.Type == JsonType.True : System.Convert.ChangeType(ToValue(obj), type, CultureInfo.InvariantCulture); break; case JsonType.String: result = type == typeof(string) ? obj.String : System.Convert.ChangeType(ToValue(obj), type, CultureInfo.InvariantCulture); break; case JsonType.Array: stack.Push(context); if (!type.IsArray && !IsGenericList(type)) { throw InvalidCastException(obj, type); } if (type.IsArray) { var element = type.GetElementType(); context = new Context { Mode = ConvertMode.Array, Type = element, DstArray = Array.CreateInstance(element, obj.Array.Count) }; } else { context = new Context { Mode = ConvertMode.List, Type = type.GetGenericArguments()[0], DstArray = ReflectiveOperation.GetObjectCreator(type)() }; } context.JsonArrayEnumerator = obj.Array.GetEnumerator(); goto ArrayNext; case JsonType.Object: if (type.IsArray) { throw InvalidCastException(obj, type); } stack.Push(context); context = new Context { Mode = ConvertMode.Object, DstObject = ReflectiveOperation.GetObjectCreator(type)(), SetterEnumerator = new SetterEnumerator(type, obj.Dictionary) }; goto ObjectNext; default: result = type == typeof(double) ? obj.Number : type == typeof(int) ? (int)obj.Number : type == typeof(float) ? (float)obj.Number : System.Convert.ChangeType(ToValue(obj), type, CultureInfo.InvariantCulture); break; } Return: if (stack.Count == 0) { return(result); } switch (context.Mode) { case ConvertMode.Array: // ReSharper disable once RedundantCast context.DstArray[context.JsonArrayEnumerator.Position] = (dynamic)result; break; case ConvertMode.List: context.DstArray.Add((dynamic)result); break; case ConvertMode.Object: context.SetterEnumerator.Current.Invoke(context.DstObject, result); goto ObjectNext; } ArrayNext: if (!context.JsonArrayEnumerator.MoveNext()) { result = context.DstArray; context = stack.Pop(); goto Return; } type = context.Type; obj = context.JsonArrayEnumerator.Current; goto Convert; ObjectNext: if (!context.SetterEnumerator.MoveNext()) { result = context.DstObject; context = stack.Pop(); goto Return; } var current = context.SetterEnumerator.Current; type = current.Type; obj = current.Value; goto Convert; }
public GetterEnumerator(object target) { _target = target; _getters = ReflectiveOperation.GetGetterList(_target.GetType()); }