using System; using Utf8Json.Internal; using System.Reflection; using Utf8Json.Formatters; using Utf8Json.Resolvers.Internal; namespace Utf8Json.Resolvers { public static class EnumResolver { /// Serialize as Name. public static readonly IJsonFormatterResolver Default = EnumDefaultResolver.Instance; /// Serialize as Value. public static readonly IJsonFormatterResolver UnderlyingValue = EnumUnderlyingValueResolver.Instance; } } namespace Utf8Json.Resolvers.Internal { internal sealed class EnumDefaultResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new EnumDefaultResolver(); EnumDefaultResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { var ti = typeof(T).GetTypeInfo(); if (ti.IsNullable()) { // build underlying type and use wrapped formatter. ti = ti.GenericTypeArguments[0].GetTypeInfo(); if (!ti.IsEnum) { return; } var innerFormatter = Instance.GetFormatterDynamic(ti.AsType()); if (innerFormatter == null) { return; } formatter = (IJsonFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter }); return; } else if (typeof(T).IsEnum) { formatter = (IJsonFormatter)(object)new EnumFormatter(true); } } } } internal sealed class EnumUnderlyingValueResolver : IJsonFormatterResolver { public static readonly IJsonFormatterResolver Instance = new EnumUnderlyingValueResolver(); EnumUnderlyingValueResolver() { } public IJsonFormatter GetFormatter() { return FormatterCache.formatter; } static class FormatterCache { public static readonly IJsonFormatter formatter; static FormatterCache() { var ti = typeof(T).GetTypeInfo(); if (ti.IsNullable()) { // build underlying type and use wrapped formatter. ti = ti.GenericTypeArguments[0].GetTypeInfo(); if (!ti.IsEnum) { return; } var innerFormatter = Instance.GetFormatterDynamic(ti.AsType()); if (innerFormatter == null) { return; } formatter = (IJsonFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter }); return; } else if (typeof(T).IsEnum) { formatter = (IJsonFormatter)(object)new EnumFormatter(false); } } } } }