You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

OptionalConverter.cs 1.5 kB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Newtonsoft.Json;
  2. using System;
  3. namespace Discord.Net.Converters
  4. {
  5. internal class OptionalConverter<T> : JsonConverter
  6. {
  7. private readonly JsonConverter _innerConverter;
  8. public override bool CanConvert(Type objectType) => true;
  9. public override bool CanRead => true;
  10. public override bool CanWrite => true;
  11. public OptionalConverter(JsonConverter innerConverter)
  12. {
  13. _innerConverter = innerConverter;
  14. }
  15. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
  16. {
  17. T obj;
  18. // custom converters need to be able to safely fail; move this check in here to prevent wasteful casting when parsing primitives
  19. if (_innerConverter != null)
  20. {
  21. object o = _innerConverter.ReadJson(reader, typeof(T), null, serializer);
  22. if (o is Optional<T>)
  23. return o;
  24. obj = (T)o;
  25. }
  26. else
  27. obj = serializer.Deserialize<T>(reader);
  28. return new Optional<T>(obj);
  29. }
  30. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  31. {
  32. value = ((Optional<T>)value).Value;
  33. if (_innerConverter != null)
  34. _innerConverter.WriteJson(writer, value, serializer);
  35. else
  36. serializer.Serialize(writer, value, typeof(T));
  37. }
  38. }
  39. }