static TypeEnumDiscriminatorMap <D> Map <B, D>(Expression <Func <B, D> > property)
            where D : struct
        {
            Type baseType = typeof(B);
            TypeEnumDiscriminatorMap <D> map;

            var propertyName = (property.Body as MemberExpression).Member.Name;

            if (!Maps.ContainsKey(baseType))
            {
                map = new TypeEnumDiscriminatorMap <D>();
                Maps.Add(baseType, map);
                map.Property = propertyName;
            }
            else
            {
                map = Maps[baseType] as TypeEnumDiscriminatorMap <D>;
                if (map.Property != propertyName)
                {
                    throw new ArgumentException("Attempt to change map property from " + map.Property + " to " + propertyName);
                }
            }

            return(map);
        }
        /// <summary>Creates the specified object type.</summary>
        /// <param name="objectType">Type of the object.</param>
        /// <param name="jsonObject">The json object.</param>
        /// <param name="serializer">The serializer.</param>
        /// <returns></returns>
        protected T Create(Type objectType, JObject jsonObject, JsonSerializer serializer)
        {
            var map = TypeEnumDiscriminatorMap.GetMap(typeof(T));

            if (map == null)
            {
                throw new ArgumentException("Type discriminator map does not exist for " + typeof(T));
            }

            var disc = jsonObject[map.Property];

            // Discriminator may not be found as default values
            // are not transmitted
            if (disc != null)
            {
                return(map.Create(disc.ToString()) as T);
            }
            return(map.Create() as T);
        }