// Copyright (c) All contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; using System.Reflection; using MessagePack.Formatters; using MessagePack.Internal; namespace MessagePack.Resolvers { public sealed class DynamicEnumAsStringResolver : IFormatterResolver { /// /// The singleton instance that can be used. /// public static readonly DynamicEnumAsStringResolver Instance; /// /// A instance with this formatter pre-configured. /// public static readonly MessagePackSerializerOptions Options; static DynamicEnumAsStringResolver() { Instance = new DynamicEnumAsStringResolver(); Options = new MessagePackSerializerOptions(Instance); } private DynamicEnumAsStringResolver() { } public IMessagePackFormatter GetFormatter() { return FormatterCache.Formatter; } private static class FormatterCache { public static readonly IMessagePackFormatter Formatter; static FormatterCache() { TypeInfo 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 = DynamicEnumAsStringResolver.Instance.GetFormatterDynamic(ti.AsType()); if (innerFormatter == null) { return; } Formatter = (IMessagePackFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter }); return; } else if (!ti.IsEnum) { return; } Formatter = (IMessagePackFormatter)(object)new EnumAsStringFormatter(); } } } }