У меня есть такие классы
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().
что для меня проблема и копирование этих значений само по себе не кажется мне чистым (что, если я что-то пропущу?)
Итак, вопрос: Есть ли лучший подход, который я пропустил для десериализации абстрактного свойства объекта на основе значения родительского свойства?