Wydaje się, że najlepszym sposobem jest skopiowanie wszystkich ustawień do nowego obiektu. Jest ich mnóstwo, więc jest tu dobra metoda rozszerzenia (od wersji 8.0.3).
Jest brzydki, ale przynajmniej trzeba go napisać tylko raz. Należy zachować ostrożność, ponieważ same właściwości nie są głęboko kopiowane.
Odpowiedź poniżej jest niestabilna w zależności od implementacji, szczególnie w przypadku rozwiązywania umowy. Trzymaj go na wszelki wypadek, jeśli komuś pomaga.
Tak, nie mogę całkiem skopiować ustawień, ale znalazłem dobrą pracę, która mogłaby chcieć zostać wzięta pod uwagę. Możesz po prostu ustawić właściwości, które chcesz zmienić, w zamkniętym kontekście, a następnie zresetować je później.
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var thing = value as IThing;
if (thing == null)
throw new ArgumentException($"Writing Json failed because " +
"value was not a 'Thing' of type, {typeof(IThing).FullName}");
JObject jsonThing;
//If your solution is multithreaded,
//and is using a shared serializer (which you probably are),
//you should lock the serializer so that it doesn't accidentally use
//the "CustomObjectResolver"
lock (serializer)
{
//Hold the original value(s) to reset later
var originalContractResolver = serializer.ContractResolver;
//Set custom value(s)
serializer.ContractResolver = new CustomObjectResolver();
//Serialization with custom properties
jsonThing = JObject.FromObject(value, serializer);
//Reset original value(s)
serializer.ContractResolver = originalContractResolver;
}
//Finish serializing and write to writer.
}
Dzięki, oszczędzam mi pisania! Trochę obrzydliwe, że musimy to zrobić, ale naprawdę powinno być coś wbudowanego w Newtonsoft.Json – Tyson