Last active
February 25, 2024 05:47
-
-
Save MuhammadSulaiman001/90c17d863341029a1644ae654945df9c to your computer and use it in GitHub Desktop.
WIP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Newtonsoft.Json; | |
namespace Utils.Newtonsoft; | |
/* | |
Usage: | |
[JsonConverter(typeof(AbstractListPropertyConverter<IEdge, ConcreteEdge>))] | |
public List<IEdge> Edges { get; set; } | |
*/ | |
public class AbstractListPropertyConverter<TInterface, TImplementation> : JsonConverter | |
where TImplementation : TInterface | |
{ | |
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |
{ | |
serializer.Serialize(writer, value); | |
} | |
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |
{ | |
// todo: why not passing only the concrete like this? | |
// var res = serializer.Deserialize<List<TImplementation>>(reader); | |
var res = serializer.Deserialize<List<TInterface>>(reader); | |
return res.Select(item => (TImplementation)item).ToList(); | |
} | |
public override bool CanConvert(Type objectType) | |
{ | |
// todo: why not return this? | |
// return objectType == typeof(TImplementation); | |
return objectType == typeof(TInterface); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Newtonsoft.Json; | |
namespace Utils.Newtonsoft; | |
/* | |
Usage: | |
[JsonConverter(typeof(AbstractPropertyConverter<ConcreteEdge>))] | |
public IEdge Edge { get; set; } | |
*/ | |
public class AbstractPropertyConverter<TImplementation> : JsonConverter | |
{ | |
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) | |
{ | |
serializer.Serialize(writer, value); | |
} | |
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) | |
{ | |
return serializer.Deserialize<TImplementation>(reader); | |
} | |
public override bool CanConvert(Type objectType) | |
{ | |
return true; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Newtonsoft.Json; | |
namespace Utils.Newtonsoft; | |
/// <summary> | |
/// Usage: you must declare a settings object and pass it to `DeserializeObject` method, for example: | |
/// 1. `var conv = new JsonConverterInstance[TAbstract, TConcrete]();` | |
/// 2. `JsonConvert.DeserializeObject(json, type, settings);` | |
/// Full Example in NewtonsoftTests.cs | |
/// </summary> | |
internal class JsonConverterInstance<TAbstract, TReal> | |
: JsonConverter where TReal : TAbstract // where TReal : class, TAbstract, new() | |
{ | |
public override bool CanConvert(Type objectType) | |
=> objectType == typeof(TAbstract); | |
public override object ReadJson(JsonReader reader, Type type, object value, JsonSerializer jser) | |
=> jser.Deserialize<TReal>(reader); | |
public override void WriteJson(JsonWriter writer, object value, JsonSerializer jser) | |
=> jser.Serialize(writer, value); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment