#if NETCOREAPP using System; using System.Reflection; using System.Text.Json; using System.Text.Json.Serialization; namespace SabreTools.Wrappers { /// /// Serializer class for abstract classes /// /// internal class ConcreteAbstractSerializer : JsonConverterFactory { public override bool CanConvert(Type typeToConvert) => typeToConvert.IsAbstract; private class ConcreteAbstractSerializerOfType : JsonConverter { static ConcreteAbstractSerializerOfType() { if (!typeof(TAbstract).IsAbstract && !typeof(TAbstract).IsInterface) throw new NotImplementedException(string.Format("Concrete class {0} is not supported", typeof(TAbstract))); } #if NETCOREAPP3_1 public override TAbstract Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => throw new NotImplementedException(); #else public override TAbstract? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => throw new NotImplementedException(); #endif public override void Write(Utf8JsonWriter writer, TAbstract value, JsonSerializerOptions options) => JsonSerializer.Serialize(writer, value!, options); } public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) => (JsonConverter)Activator.CreateInstance( typeof(ConcreteAbstractSerializerOfType<>).MakeGenericType([type]), BindingFlags.Instance | BindingFlags.Public, binder: null, args: [], culture: null).ThrowOnNull(); } } #endif