/// <summary> /// <see cref="JsonConverter{T}.WriteJson(JsonWriter, object, JsonSerializer)" /> /// </summary> public override void WriteJson(JsonWriter writer, IGenericPersistedDTO value, JsonSerializer serializer) { // Récupération de la configuration var cfg = GenericJsonTypeIndex.GetConfigurationByType(value.GetType()); var kt = cfg.KeyType; var key = cfg.UnsafeGetNameByType(value.GetType()); // Conversion var job = JObject.FromObject(value); job.Add(PersistedJsonContractResolver.TYPE_PROPERTY_NAME, key); // Ecriture job.WriteTo(writer, CONVERTERS); }
/// <summary> /// <see cref="JsonConverter{T}.ReadJson(JsonReader, Type, T, bool, JsonSerializer)" /> /// </summary> public override IGenericPersistedDTO ReadJson(JsonReader reader, Type objectType, IGenericPersistedDTO existingValue, bool hasExistingValue, JsonSerializer serializer) { // Récupération du type var obj = JObject.Load(reader); var val = obj[PersistedJsonContractResolver.TYPE_PROPERTY_NAME].Value <string>(); // Récupération de la configuration var cfg = GenericJsonTypeIndex.GetConfigurationByType(objectType); var key = Enum.Parse(cfg.KeyType, val); var instance = cfg.UnsafeGetInstance(key); // Renvoi serializer.Populate(obj.CreateReader(), instance); return(instance); }
/// <summary> /// Mappage d'un DTO polymorphe sérialisable au format JSON. /// </summary> /// <typeparam name="TProperty">Type de DTO base.</typeparam> /// <typeparam name="TKey">Type de clef utilisée.</typeparam> /// <param name="property">Propriété mappée.</param> /// <param name="types">Liste des types supportés.</param> /// <param name="configuration">Actions de configuration.</param> protected void PropertyJsonGeneric <TProperty, TKey>(Expression <Func <TEntity, TProperty> > property, Action <GenericJsonTypeConfiguration <TProperty, TKey> > types, Action <IPropertyMapper> configuration = null) where TProperty : IGenericPersistedDTO where TKey : struct, IConvertible { Property( property, mapper => { // Création de la configuration var inner = new GenericJsonTypeConfiguration <TProperty, TKey>(); types(inner); // Référencement GenericJsonTypeIndex.AddConfiguration <TKey, TProperty>(inner); // Création de l'enveloppe var wrapper = new GenericJsonTypeWrapper <TProperty, TKey>(inner); // Paramétrage mapper.Type <GenericJsonType <TProperty, TKey> >(wrapper); mapper.Columns( type => { type.Name( string.Concat( (property.Body as MemberExpression).Member.Name, "_type")); }, dto => { dto.Name( string.Concat( (property.Body as MemberExpression).Member.Name, "_data")); }); configuration?.Invoke(mapper); }); }