// 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.Linq; using System.Reflection; using MessagePack.Formatters; using MessagePack.Internal; namespace MessagePack.Resolvers { /// /// Get formatter from . /// public sealed class AttributeFormatterResolver : IFormatterResolver { /// /// The singleton instance that can be used. /// public static readonly AttributeFormatterResolver Instance = new AttributeFormatterResolver(); private AttributeFormatterResolver() { } public IMessagePackFormatter GetFormatter() { return FormatterCache.Formatter; } private static class FormatterCache { public static readonly IMessagePackFormatter Formatter; static FormatterCache() { #if UNITY_2018_3_OR_NEWER && !NETFX_CORE var attr = (MessagePackFormatterAttribute)typeof(T).GetCustomAttributes(typeof(MessagePackFormatterAttribute), true).FirstOrDefault(); #else MessagePackFormatterAttribute attr = typeof(T).GetTypeInfo().GetCustomAttribute(); #endif if (attr == null) { return; } var formatterType = attr.FormatterType; if (formatterType.IsGenericType && !formatterType.IsConstructedGenericType) { formatterType = formatterType.MakeGenericType(typeof(T).GetGenericArguments()); } Formatter = (IMessagePackFormatter)ResolverUtilities.ActivateFormatter(formatterType, attr.Arguments); } } } }