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