JSON.NET: Wie deserialisiere ich die Schnittstelleneigenschaft basierend auf dem Wert des übergeordneten (Inhaber-) Objekts?

Ich habe solche Klassen

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
}

Mit WebAPI möchte ich das Objekt erhaltenHolder und deserialisieren Sie es richtig. Basierend aufObjType Wert, den ich braucheObjects Eigentum entweder als deserialisiert werdenList<DerivedType1> (ObjType == 1) oderList<DerivedType2> (ObjType == 2).

Im Moment habe ich SO und Internet nach dem besten Ansatz durchsucht, aber das Beste, was ich gefunden habe, ist diese Antworthttps://stackoverflow.com/a/8031283/1038496. Das Problem dieser Lösung ist, dass es den Kontext des übergeordneten Objekts verliert, sodass ich den Wert von nicht herausfinden kannObjType. OK, ich könnte das Problem lösen, indem ich eine benutzerdefinierte Version erstelleJsonConverter zumHolder und erinnere mich an dieObjType Wert, aber ich habe immer noch Angst vor dieser Linie

serializer.Populate(jObject.CreateReader(), target);

wie der Kommentar unter dieser Antwort sagt

Der neue JsonReader, der mit der ReadJson-Methode erstellt wurde, erbt keine der Konfigurationswerte des ursprünglichen Readers (Culture, DateParseHandling, DateTimeZoneHandling, FloatParseHandling usw.). Diese Werte sollten kopiert werden, bevor der neue JsonReader in serializer.Populate () verwendet wird.

Was ist ein Problem für mich und das Kopieren dieser Werte durch mich selbst scheint mir nicht sauber zu sein (was ist, wenn ich etwas vermisse?)

Die Frage ist also:Gibt es einen besseren Ansatz, den ich versäumt habe, abstrakte Objekteigenschaften basierend auf dem Wert der übergeordneten Eigenschaften zu deserialisieren?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage