/// <summary>
        /// Reads the JSON representation of the object.
        /// </summary>
        /// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="existingValue">The existing value of object being read.</param>
        /// <param name="serializer">The calling serializer.</param>
        /// <returns>The object value.</returns>
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            EnsureReflectionObject(objectType);
            MiscellaneousUtils.Assert(_reflectionObject != null);

            object entityKeyMember = _reflectionObject.Creator();

            ReadAndAssertProperty(reader, KeyPropertyName);
            reader.ReadAndAssert();
            _reflectionObject.SetValue(entityKeyMember, KeyPropertyName, reader.Value?.ToString());

            ReadAndAssertProperty(reader, TypePropertyName);
            reader.ReadAndAssert();
            string type = reader.Value?.ToString();

            Type t = Type.GetType(type);

            ReadAndAssertProperty(reader, ValuePropertyName);
            reader.ReadAndAssert();
            _reflectionObject.SetValue(entityKeyMember, ValuePropertyName, serializer.Deserialize(reader, t));

            reader.ReadAndAssert();

            return(entityKeyMember);
        }
        public override object ReadJson(JsonReader reader, Type objectType, [Nullable(2)] object existingValue, JsonSerializer serializer)
        {
            EntityKeyMemberConverter.EnsureReflectionObject(objectType);

            object obj = EntityKeyMemberConverter._reflectionObject.Creator(new object[0]);

            EntityKeyMemberConverter.ReadAndAssertProperty(reader, "Key");
            reader.ReadAndAssert();
            ReflectionObject reflectionObject = EntityKeyMemberConverter._reflectionObject;
            object           target           = obj;
            string           member           = "Key";
            object           value            = reader.Value;

            reflectionObject.SetValue(target, member, (value != null) ? value.ToString() : null);
            EntityKeyMemberConverter.ReadAndAssertProperty(reader, "Type");
            reader.ReadAndAssert();
            object value2 = reader.Value;
            Type   type   = Type.GetType((value2 != null) ? value2.ToString() : null);

            EntityKeyMemberConverter.ReadAndAssertProperty(reader, "Value");
            reader.ReadAndAssert();
            EntityKeyMemberConverter._reflectionObject.SetValue(obj, "Value", serializer.Deserialize(reader, type));
            reader.ReadAndAssert();
            return(obj);
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            EnsureReflectionObject(objectType);
            object target = _reflectionObject.Creator(new object[0]);

            ReadAndAssertProperty(reader, "Key");
            reader.ReadAndAssert();
            _reflectionObject.SetValue(target, "Key", reader.Value.ToString());
            ReadAndAssertProperty(reader, "Type");
            reader.ReadAndAssert();
            Type type = Type.GetType(reader.Value.ToString());

            ReadAndAssertProperty(reader, "Value");
            reader.ReadAndAssert();
            _reflectionObject.SetValue(target, "Value", serializer.Deserialize(reader, type));
            reader.ReadAndAssert();
            return(target);
        }
        /// <summary>
        /// Reads the JSON representation of the object.
        /// </summary>
        /// <param name="reader">The <see cref="JsonReader"/> to read from.</param>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="existingValue">The existing value of object being read.</param>
        /// <param name="serializer">The calling serializer.</param>
        /// <returns>The object value.</returns>
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            EnsureReflectionObject(objectType);

            var entityKeyMember = _reflectionObject.Creator();

            ReadAndAssertProperty(reader, KeyPropertyName);
            ReadAndAssert(reader);
            _reflectionObject.SetValue(entityKeyMember, KeyPropertyName, reader.Value.ToString());

            ReadAndAssertProperty(reader, TypePropertyName);
            ReadAndAssert(reader);
            var type = reader.Value.ToString();

            var t = Type.GetType(type);

            ReadAndAssertProperty(reader, ValuePropertyName);
            ReadAndAssert(reader);
            _reflectionObject.SetValue(entityKeyMember, ValuePropertyName, serializer.Deserialize(reader, t));

            ReadAndAssert(reader);

            return(entityKeyMember);
        }