csharp/1996v/Bssom.Net/Bssom.Serializer/Resolvers/PrimitiveResolver.cs

PrimitiveResolver.cs
//using System.Runtime.CompilerServices;

using Bssom.Serializer.Formatters;
using Bssom.Serializer.Internal;
using System;
using System.Collections.Generic;

namespace Bssom.Serializer.Resolvers
{
    /// 
    /// Provides formatters for ,,,,,,,,,,,,,,,
    /// 
    public sealed clast PrimitiveResolver : IFormatterResolver
    {
        /// 
        /// The singleton instance that can be used.
        /// 
        public static readonly PrimitiveResolver Instance = new PrimitiveResolver();

        public IBssomFormatter GetFormatter()
        {
            return FormatterCache.Formatter;
        }

        private static clast FormatterCache
        {
            public static readonly IBssomFormatter Formatter;

            static FormatterCache()
            {
                Type t = typeof(T);

                if (PrimitiveResolverGetFormatterHelper.TryGetFormatter(t, out IBssomFormatter formatter))
                {
                    Formatter = (IBssomFormatter)formatter;
                }
            }
        }
    }
}
namespace Bssom.Serializer.Internal
{
    internal static clast PrimitiveResolverGetFormatterHelper
    {
        private static readonly Dictionary FormatterMap = new Dictionary()
        {
            { typeof(sbyte), Int8Formatter.Instance },
            { typeof(Int16), Int16Formatter.Instance },
            { typeof(Int32), Int32Formatter.Instance },
            { typeof(Int64), Int64Formatter.Instance },
            { typeof(byte), UInt8Formatter.Instance },
            { typeof(UInt16), UInt16Formatter.Instance },
            { typeof(UInt32), UInt32Formatter.Instance },
            { typeof(UInt64), UInt64Formatter.Instance },
            { typeof(Single), Float32Formatter.Instance },
            { typeof(Double), Float64Formatter.Instance },
            { typeof(bool), BooleanFormatter.Instance },
            { typeof(string), StringFormatter.Instance },
            { typeof(DateTime), DateTimeFormatter.Instance },

            //native
            { typeof(char), CharFormatter.Instance },
            { typeof(Guid), GuidFormatter.Instance },
            { typeof(Decimal), DecimalFormatter.Instance },
        };

        internal static bool TryGetFormatter(Type t, out IBssomFormatter formatter)
        {
            if (FormatterMap.TryGetValue(t, out formatter))
            {
                return true;
            }

            return false;
        }
    }
}