-
Notifications
You must be signed in to change notification settings - Fork 134
/
Copy pathPolymorphicTypenameConverter.cs
33 lines (26 loc) · 1.19 KB
/
PolymorphicTypenameConverter.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace GraphQL.Client.Serializer.SystemTextJson
{
public abstract class PolymorphicTypenameConverter<T> : JsonConverter<T>
{
protected abstract Type GetTypeFromTypenameField(string typename);
public override bool CanConvert(Type typeToConvert) =>
typeof(T).IsAssignableFrom(typeToConvert);
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var clone = reader; // cause its a struct
if (clone.TokenType == JsonTokenType.StartObject)
clone.Read();
if (clone.TokenType != JsonTokenType.PropertyName || clone.GetString() != "__typename")
throw new JsonException();
clone.Read();
var type = Descriminator(clone.GetString());
object deserialize = JsonSerializer.Deserialize(ref reader, type, options);
return (T)deserialize;
}
public override void Write(Utf8JsonWriter writer, T obj, JsonSerializerOptions options) =>
throw new NotSupportedException();
}
}