У меня есть такие классы
class Holder {
public int ObjType { get; set; }
public List<Base> Objects { get; set; }
}
abstract class Base {
// ... doesn't matter
}
class DerivedType1 : Base {
// ... doesn't matter
}
class DerivedType2 : Base {
// ... doesn't matter
}
Используя WebAPI, я хочу получить объект Holder
и десериализировать его правильно. Основываясь на значении ObjType
, мне нужно, чтобы свойство Objects
десериализовалось либо как List<DerivedType1>
(ObjType == 1
), либо List<DerivedType2>
(ObjType == 2
).
В настоящий момент я искал SO и Интернет для лучшего подхода, но лучшее, что я нашел, - это ответ qaru.site/info/4493/.... Проблема этого решения заключается в том, что он освобождает контекст родительского объекта, поэтому я не могу узнать значение ObjType
. Хорошо, я мог бы решить эту проблему, создав пользовательский JsonConverter
для Holder
и вспомнив значение ObjType
, но все же я боюсь этой строки
serializer.Populate(jObject.CreateReader(), target);
как комментарий ниже этого ответа говорит
Новый JsonReader, созданный в методе ReadJson, не наследует никаких исходных значений конфигурации считывателя (Culture, DateParseHandling, DateTimeZoneHandling, FloatParseHandling и т.д.). Эти значения должны быть скопированы перед использованием нового JsonReader в serializer.Populate().
что для меня проблема и копирование этих значений само по себе не кажется мне чистым (что, если я что-то пропущу?)
Итак, вопрос: Есть ли лучший подход, который я пропустил для десериализации абстрактного свойства объекта на основе значения родительского свойства?