private static void ReadAndAssertProperty(JsonReader reader, string propertyName)
 {
     EntityKeyMemberConverter.ReadAndAssert(reader);
     if (reader.TokenType != JsonToken.PropertyName || !string.Equals(reader.Value.ToString(), propertyName, StringComparison.OrdinalIgnoreCase))
     {
         throw new JsonSerializationException("Expected JSON property '{0}'.".FormatWith(CultureInfo.InvariantCulture, propertyName));
     }
 }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            IEntityKeyMember entityKeyMember = DynamicWrapper.CreateWrapper <IEntityKeyMember>(Activator.CreateInstance(objectType));

            EntityKeyMemberConverter.ReadAndAssertProperty(reader, "Key");
            EntityKeyMemberConverter.ReadAndAssert(reader);
            entityKeyMember.Key = reader.Value.ToString();
            EntityKeyMemberConverter.ReadAndAssertProperty(reader, "Type");
            EntityKeyMemberConverter.ReadAndAssert(reader);
            string typeName = reader.Value.ToString();
            Type   type     = Type.GetType(typeName);

            EntityKeyMemberConverter.ReadAndAssertProperty(reader, "Value");
            EntityKeyMemberConverter.ReadAndAssert(reader);
            entityKeyMember.Value = serializer.Deserialize(reader, type);
            EntityKeyMemberConverter.ReadAndAssert(reader);
            return(DynamicWrapper.GetUnderlyingObject(entityKeyMember));
        }