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); }