Ich verstehe, dass wir, da wir die Minimal-API verwenden, keine andere Wahl haben, als System.Text zu verwenden. Json, und dies verursacht einige Probleme mit Polymorphismus, was entweder dazu führt, dass im zurückgegebenen JSON keine Objekttypen vorhanden sind, oder dass beim Versuch, [JsonDerivedType(...)] zu verwenden, zur Laufzeit ein Fehler auftritt:
System.ArgumentException: Ein Element mit demselben Schlüssel wurde bereits hinzugefügt. Schlüssel: [Schlüsselname...]
Ich habe das Gefühl, dass dies am Grad der Vererbung liegt. Ich kann den eigentlichen Code hier nicht posten, aber das Folgende fasst das Problem zusammen, mit dem ich konfrontiert bin (Beschreibung unten): In der Lösung sind die Schnittstellen und Klassen alle separate Dateien, aber der Kürze halber habe ich sie hier in einem Block aufgelistet :
Code: Select all
public interface IContainer: IObject {
List Children {get;set;}
}
public interface IObject {
int Id {get;set;} //Lots of other parameters
}
public class ObjectType1 : DisplayBaseClass, IChild { //class }
public class ObjectType2 : DisplayBaseClass, IContainer { //class }
public class ObjectType3 : SomeOtherClass, IChild, IAnotherInterface, IAndAnother { //class }
Code: Select all
IObject
Das erste, was ich versucht habe, war:
Code: Select all
[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
[JsonDerivedType(typeof(ObjectType3), "[type discriminator here...]")]
public interface IObject {...
Ich habe insofern Fortschritte gemacht, als ich die Attribute [JsonDerivedType] in separate Schnittstellendefinitionen aufgeteilt habe:
Code: Select all
//in IContainer.cs
[JsonPolymorphic(UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(ObjectType2), "[type discriminator here...]")]
public interface IContainer {...
//In IChild.cs
[JsonDerivedType(typeof(ObjectType1), "[type discriminator here...]")]
public interface IChild{...
Das Problem ist, dass ich nicht herausfinden kann, wie ich einen abgeleiteten Typ für ObjectType3 hinzufügen kann – wenn ich [JsonDerivedType(nameof(ObjectType3), "...")] zu IObject.cs hinzufüge, erhalte ich wieder doppelte Schlüssel und kann Swagger nicht verwenden .
Kann jemand erklären, was? Ich mache etwas falsch, insbesondere was die Frage angeht, wie man die abgeleiteten Typen hinzufügt, ohne dass doppelte Schlüssel entstehen?