Ich weiß, dass es ein Attribut gibt, mit dem private Setter behandelt werden können, aber ich möchte dieses Verhalten standardmäßig. Gibt es eine Möglichkeit, dies zu erreichen? Außer die Quelle zu optimieren. Wäre toll, wenn es dafür eine Einstellung gäbe.
92
Antworten:
Ich bin hierher gekommen, um nach dem tatsächlichen Attribut zu suchen, mit dem Json.NET beim Deserialisieren eine schreibgeschützte Eigenschaft auffüllt, und das ist einfach
[JsonProperty]
, z.Alternative Lösung
Geben Sie einfach einen Konstruktor an, dessen Parameter mit Ihrer Eigenschaft übereinstimmt:
Nun funktioniert das:
Ich bevorzuge diesen Ansatz, wenn möglich, da:
{ get; private set; }
und nur{ get; }
.quelle
{get;private set;}
, nicht mit{get;}
{ get; }
wenn der Typ einen Konstruktor mit einem Parameter hat, der mit dem Eigenschaftsnamen übereinstimmt.Aktualisierte, neue Antwort
Ich habe dafür eine Quelldistribution NuGet geschrieben, die eine einzelne Datei mit zwei benutzerdefinierten Vertragsauflösern installiert:
Installieren Sie das NuGet:
Verwenden Sie dann einfach einen der Resolver:
Sie können darüber hier lesen: http://danielwertheim.se/json-net-private-setters-nuget/
GitHub-Repo: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers
Alte Antwort (noch gültig)
Es gibt zwei Alternativen, die das Problem lösen können.
Alt 1: Auf den Deserialisierern
Die Standard-Serialisierungsoption unterstützt alle Arten von Klassenmitgliedern. Daher gibt diese Lösung alle privaten Mitgliedstypen einschließlich Felder zurück. Ich bin nur daran interessiert, auch private Setter zu unterstützen.
Alt2: Erstellen Sie einen benutzerdefinierten ContractResolver:
Daher ist dies die bessere Option, da wir nur die Eigenschaften überprüfen.
Weitere Informationen finden Sie in meinem Beitrag: http://danielwertheim.se/json-net-private-setters/
quelle
DefaultMembersSearchFlags
wurde veraltet .{get; }
ist NICHT gleichbedeutend mit{ get; private set; }
. Für den ersten Wegproperty.GetSetMethod(true)
kehrtnull
der letztere zurücktrue
. Das hat mich überrascht. Sie müssen haben,private set;
damit die Deserialisierung wie erwartet funktioniert.@ Daniels Antwort (Alt2) ist genau richtig, aber ich brauchte sie, um sowohl für private Setter als auch für Getter zu funktionieren (ich arbeite mit einer API, die tatsächlich ein paar schreibgeschützte Dinge enthält, wie z
user.password
. B.) .So registriert:
quelle