Ejemplo n.º 1
0
        private object CreateDynamic(JsonReader reader, JsonDynamicContract contract, string id)
        {
            IDynamicMetaObjectProvider newObject = null;

            if (contract.UnderlyingType.IsInterface || contract.UnderlyingType.IsAbstract)
            {
                throw new JsonSerializationException("Could not create an instance of type {0}. Type is an interface or abstract class and cannot be instantated.".FormatWith(CultureInfo.InvariantCulture, contract.UnderlyingType));
            }

            if (contract.DefaultCreator != null &&
                (!contract.DefaultCreatorNonPublic || Serializer.ConstructorHandling == ConstructorHandling.AllowNonPublicDefaultConstructor))
            {
                newObject = (IDynamicMetaObjectProvider)contract.DefaultCreator();
            }

            if (id != null)
            {
                Serializer.ReferenceResolver.AddReference(id, newObject);
            }

            contract.InvokeOnDeserializing(newObject, Serializer.Context);

            bool exit = false;

            do
            {
                switch (reader.TokenType)
                {
                case JsonToken.PropertyName:
                    string memberName = reader.Value.ToString();
                    if (!reader.Read())
                    {
                        throw new JsonSerializationException("Unexpected end when setting {0}'s value.".FormatWith(CultureInfo.InvariantCulture, memberName));
                    }

                    // first attempt to find a settable property, otherwise fall back to a dynamic set without type
                    JsonProperty property = contract.Properties.GetClosestMatchProperty(memberName);
                    if (property != null && property.Writable && !property.Ignored)
                    {
                        SetPropertyValue(property, reader, newObject);
                    }
                    else
                    {
                        object value = (JsonReader.IsPrimitiveToken(reader.TokenType))
                ? reader.Value
                : CreateObject(reader, typeof(IDynamicMetaObjectProvider), GetContractSafe(typeof(IDynamicMetaObjectProvider), null), null, null);

                        newObject.TrySetMember(memberName, value);
                    }
                    break;

                case JsonToken.EndObject:
                    exit = true;
                    break;

                default:
                    throw new JsonSerializationException("Unexpected token when deserializing object: " + reader.TokenType);
                }
            } while (!exit && reader.Read());

            contract.InvokeOnDeserialized(newObject, Serializer.Context);

            return(newObject);
        }
Ejemplo n.º 2
0
 public override void SetValue(object component, object value)
 {
     instance.TrySetMember(name, value);
 }